结构型设计模式 -- 适配器模式

一、小案例分析

1、功能需求:

以电源适配器为例。
  一个人去外国旅游,住在外国某宾馆,恰好手机没电(手机是双孔插头),但外国宾馆只有三孔插座,宾馆一般不可能为了旅客,将三孔插座换成双孔插座,此时适配器就派上用场了,将双孔插头转成三孔插头,即可满足要求。

2、什么是适配器模式:

  适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

3、适配器模式分类

(1)类适配器模式
(2)对象适配器模式
(3)接口适配器模式

4、适配器模式的角色:

(1)源(Adaptee):需要被适配的对象或类型,相当于双孔插头。
(2)适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。
(3)目标(Target):期待得到的目标,相当于三孔插头。

二、适配器模式

1、类适配器模式实现案例:

(1)适配器对象继承原有类(比如三孔插头)。
(2)适配器对象组合一个实现新接口的对象(比如双孔插头)。
(3)适配器原有的方法调用被委托给新接口的实例的方法。即在新接口的方法中调用原有类的方法。(使双孔插头可以调用三孔插头)
(4)代码实现:

package adapter.pattern.demo1;

/**
 * 测试类, 测试类适配器模式
 */
public class ClassAdapterDemo {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.show2();
    }
}

/**
 * 三孔插头(原有类)
 *
 */
class ThreeHolePlug {
    public void show1() {
        System.out.println("三孔插头");
    }
}

/**
 * 双孔插头(新需求)
 */
interface DoubleHolePlug {
    public void show2();
}

/**
 * 继承原有类,并实现新接口,重写接口中的方法,并调用原有类的方法。
 *
 */
class Adapter extends ThreeHolePlug implements DoubleHolePlug {

    @Override
    public void show2() {
        show1();
    }
}

(5)代码分析:
  采用继承实现,使该类有一定的局限性。但是可以根据需求获取或重写原有类的方法。
(6)UML图:

2、对象适配器模式实现案例

(1)适配器对象内部持有原有类的实例对象。(即三孔插口对象)
(2)适配器对象组合一个实现新接口的对象(比如双孔插头)。
(3)适配器原有的方法调用被委托给新接口的实例的方法。即在新接口的方法中调用原有类的方法。(使双孔插头可以调用三孔插头)
(4)代码实现:

package adapter.pattern.demo2;

/**
 * 测试类, 测试对象适配器模式
 */
public class ObjectAdapterDemo {
    public static void main(String[] args) {
        Adapter adapter = new Adapter(new ThreeHolePlug());
        adapter.show2();
    }
}

/**
 * 三孔插头(原有类)
 *
 */
class ThreeHolePlug {
    public void show1() {
        System.out.println("三孔插头");
    }
}

/**
 * 双孔插头(新需求)
 */
interface DoubleHolePlug {
    public void show2();
}

/**
 * 实现新接口,重写接口中的方法,将原有类的的实例化对象放入适配器中,通过实例化对象去调用原有类的方法。
 *
 */
class Adapter implements DoubleHolePlug {

    ThreeHolePlug threeHolePlug;

    /**
     * 构造器,将原有类的实例对象传入适配器
     *
     * @param threeHolePlug
     *            原有类的实例对象
     */
    public Adapter(ThreeHolePlug threeHolePlug) {
        this.threeHolePlug = threeHolePlug;
    }

    @Override
    public void show2() {
        threeHolePlug.show1();
    }
}

(5)代码分析:
  此段代码,根据合成复用原则,使用聚合的方式代替继承,降低了继承的局限性,且不再要求新需求必须是接口。
(6)UML图:

3、接口适配器模式(缺省适配器模式):

(1)当一个接口中抽象方法过多时,实现这个类需要将所有的方法实现,不友好。可以采用一个抽象类,实现接口、重写所有方法(将其重写为空方法)。此时继承抽象类,并根据需要选择重写的方法即可。
(2)适用于使用一个接口,却不想重写接口中所有方法的情景。
(3)代码实现:

package adapter.pattern.demo3;

/**
 * 测试类, 测试接口适配器模式
 */
public class InterfaceAdapterDemo {
    public static void main(String[] args) {
        // 根据自己的需求,重写相关方法,不需要全部重写
        new MoveApapter() {

            @Override
            public void up() {
                System.out.println("向上移动");
            }
        }.up();

        new MoveApapter() {

            @Override
            public void down() {
                System.out.println("向下移动");
            }
        }.down();
    }
}

/**
 * 接口中含有多个抽象方法
 *
 */
interface Move {
    void up();

    void down();

    void left();

    void right();
}

/**
 * 抽象类,实现接口,并重写所有的方法为空方法
 *
 */
abstract class MoveApapter implements Move {

    @Override
    public void up() {
    }

    @Override
    public void down() {
    }

    @Override
    public void left() {
    }

    @Override
    public void right() {
    }

}

(4)UML图:

(0)

相关推荐

  • 设计模式之适配器模式案例详解

    基本介绍 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作. 适配器模式属于结构性模式,主要分为三类:类适配器模式.对象适 ...

  • 设计模式(七)——适配器模式(SpringMVC框架分析)

    适配器模式1 现实生活中的适配器例子泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了. 2 基本介绍1) 适配器模式(Adapter Pattern)将某个类的接口 ...

  • 通俗易懂系列 | 设计模式(三):适配器模式

    今天看了部特工电影,里面有个桥段,主角在直升机上和反派生死搏斗,而飞机则是无人驾驶的状态,有坠毁的危险.生死存亡,危急时刻主角让团队成员去驾驶,而团队成员很慌张地说:"Hey, man,你开 ...

  • JAVA面向对象程序设计之结构型&行为型设计模式

    https://www.shengchulai.com/blog-SG6zA2vFeR.htm 1 结构型模式介绍 结构型模式描述如何组织类和对象以组成更大的结构.结构型类模式采用继承机制来组合接口和 ...

  • 每天学习一个设计模式(一):结构型之适配器模式

    一.基本概念 适配器模式是将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的的类的兼容性问题. 二.通俗解释 ADAPTER 适配器模式:在朋友聚会上碰到了一个美女Sar ...

  • 结构型设计模式总结

    Intro 前面几篇文章已经介绍完了所有的结构型设计模式,来做一个总结 结构型设计模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决一些特定应用场景的问题. 结构型模式包括:代理模 ...

  • 结构型设计模式 - 组合模式详解

    基本介绍 1.组合模式(Composite Pattern)又叫部分整体模式,他创建了对象组的树形结构,将对象组合成树状结构以表示「整体 - 部分」的层次关系. 2.组合模式使得用户对单个对象和组合对 ...

  • 结构型设计模式 - 装饰者模式详解

    基本定义 装饰者模式属于结构型模式,它可以动态的将新功能附加到对象上,同时又不改变其结构.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). 模式结构 装饰者和被装饰者有相同 ...

  • 结构型设计模式(下)

    装饰模式: 1.定义:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活 2.模型结构: (1)抽象构件(Component):定义一个抽象接口以规范准备接收附加责 ...

  • 技术图文:03 结构型设计模式(下)

    结构型设计模式(下) 本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结. 知识结构: 图1 知识结构 组合模式 -- 树形结构的处理 Sunny 软件公司欲开发一个杀毒( ...

  • 技术图文:03 结构型设计模式(上)

    结构型设计模式(上) 本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结. 知识结构: 图1 知识结构 享元模式 -- 实现对象的复用 Sunny 软件公司欲开发一个围棋软 ...

  • 设计模式-结构型模式总结

    结构型模式主要处理类或对象的组合,关注于如何将现有类或对象组织在一起形成更大的结构. 适配器模式 将一个类的接口转换成客户希望的另外一个接口,使原本不能一起工作的类可以一起工作. 适配器模式属于补偿机 ...

  • 无废话设计模式(11)结构型模式--代理模式

    0-前言 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问. 1-实现 1-1.简单UML图: 1-2.代码实现 //1.抽象父类 abstract class Actor { public ...