适配器模式(十五)

一、定义

    将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
    适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个,还包括了之前的装饰者模式。

扩展:

    适配器模式最开始的应用实在工业上,如下图A、B两个图框代表已经塑模成型的物体A和物体B,那现在要求把A和B安装在一起使用,如何安装?两者的接口不一致,是不可能安装在一起使用的,那怎么办?引入一个物体C,即


    其中的物体C就是我们说的适配器,它在中间起到了角色转换的作用,把原有的长条形接口转换了三角形接口。在我们软件业的设计模式中,适配器模式也是相似的功能。


二、适配器模式的主要角色

1. Target 目标角色

    该角色定义把其他类转换为何种接口,也就是我们的期望接口。

public interface Target {
    //目标角色有自己的方法
    public void request();
}

public class ConcreteTarget implements Target {
    public void request() {
        System.out.println("if you need any help,pls call me!");
    }
}

2. Adaptee 被适配者

    该角色即源角色。

public class Adaptee {
    //原有的业务逻辑
    public void doSomething(){
        System.out.println("I'm kind of busy,leave me alone,pls!");
    }
}

3. Adapter 适配器

    该角色即适配器模式的核心角色,它的职责十分简单,就是把 Adaptee 转化成 Target,怎么转化?通过继承或者类关联的方式。

public class Adapter extends Adaptee implements Target {
    public void request() {
        super.doSomething();
    }
}

三、适配器模式的优点

  • 可以让两个没有关系的类一起运行
  • 提高了类的复用度
    源角色在原有的系统中还是可以正常使用,而在目标角色中也可以充当新的演员。
  • 灵活性非常好
    某一天,突然不想要适配器,没问题,删除掉这个适配器就可以了,其他的代码都不用修改,基本上就类似一个灵活的构件,想用就用,不想就卸载。


四、适配器的分类

1. 类适配器
    通过继承关系进行适配的适配器叫做类适配器,类适配器一般是通过覆写源角色的方法进行扩展,例如
public class Adapter extends Adaptee implements Target {
    public void request() {
        super.doSomething();
    }
}
2. 对象适配器
    通过类的关联关系进行耦合的适配器叫做对象适配器,一般持有几个对象的引用,在设计时也比较灵活,例如
public class Adapter implements Target {
    private Adaptee1 adaptee1;
    private Adaptee2 adaptee2;
    public Adapter(Adaptee1 adaptee1, Adaptee2 adaptee2) {
        this.adaptee1 = adaptee1;
        this.adaptee2 = adaptee2;
    }
    public void request() {
        adapter1.doSomething();
        adapter2.doSomething();
    }
}


五、适配器模式的应用

  • 系统扩张时
    例如新建立的类想要适应一个已经投产的接口,修改是不可能的了,适配器就是最好的选择。
  • ListView 等的数据适配
    熟悉 Android 开发的肯定都接触过 ListView 等,使用它们都需要我们设置一个适配器(继承自 BaseAdapter)。因为布局的绘制需要的都是 View 对象,而我们的数据全是千奇百怪,所以就需要有这么一个适配器,将各种各样的数据转化成 View 对象。



查看更多:设计模式分类以及六大设计原则

猜你喜欢

转载自blog.csdn.net/afei__/article/details/80712914