设计模式 适配器模式

162 阅读2分钟

模式介绍

  • 对于从事android开发的开发人员对这个模式极其熟悉,从最早的ListView、GridView到现在的RecycleView都需要使用Adapter。适配器是将两个不兼容的类融合在一起,它优点像粘合剂,将不同的东西通过转换使它们能够协助起来。例如,两个没有关系的类进行交互,第一个解决方案是修改各自类的接口,但如果没有源代码的情况下怎么办呢?这种情况下就需要使用一个adapter,这个Adapter会将两个接口进行兼容,在不修改原有代码的情况下满足需求。

定义与类型

  • 定义:把一个类的接口变化成客户端需要的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作。
  • 类型:结构性

使用场景

  • 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
  • 想要创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作
  • 需要一个统一的输出接口,而输入端的类型不可预知
  • 不是系统设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成的功能类似而接口不相同情况下的解决方案

优点

  • 能提高类的透明性和复用,现有的类服用但不需要改变
  • 目标类和适配器类解耦,提高程序扩展性
  • 符合开闭原则

缺点

  • 适配器的编写过程需要全面考虑,可能会增加系统的复杂性
  • 增加代码可读的难度

扩展

  • 对象适配器
  • 类适配器

类适配器

Class-Adapter
定义

  • 如图Class-Adapter所示,适配器是通过实现Target接口以及继承Adaptee类来实现接口转换。
  • 目标接口需要的是opration2,但是Adaptee对象只有一个Operation3,因此出现了不兼容的情况,此时通过Adapter实现一个operation2函数,将Adaptee的operation3转换为Target需要的Operation2,以此实现兼容

简单示例

  • Adaptee:
public class Adaptee {
    public void Operation3(){
        System.out.println("被适配者的方法");
    }

}
  • Target:
public interface Target {
    void opration1();
    void opration2();
}
  • Adapter:
public class Adapter extends Adaptee implements Target{
    @Override
    public void opration2() {
        super. opration23t();
    }
    //...
}

对象适配器

Object-Adapter
定义

  • 与类适配器唯一不同的是,Adapter不是通过继承而是通过依赖关联Adaptee,其他都是一样的。

简单示例

  • Adapter:
public class Adapter extends Adaptee implements Target{
  private  Adaptee adaptee = new Adaptee()
    @Override
    public void opration2() {
        adaptee. opration23t();
    }
    //...
}