设计模式 适配器模式


适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构模式

 模式动机:

  适配器的实现就是把客户类的请求转化为对适配者的相应的接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。

 模式结构:

  Target:目标抽象类(需求方)

  Adapter:适配器类(转换方)

  Adaptee:适配者类(提供方)

  Client:客户类

类适配器结构图:

经典代码实现:

图像解析:类适配器中DogAdapter为适配器类,它实现了Robot(需求方)的接口,并且继承了Dog类。

实现流程解析:一般为client持有DogAdapter的类名,通过向Robot发起请求,获得一个实例化的DogAdapter(实现了Robot接口)对象,DogAdapter继承了Dog,因此可以调用Dog中相应的方法。

 对象适配器结构图:

经典代码实现:

图像解析:CipherAdapter是一个适配器类,它拥有适配者类Caesar的对象属性,继承目标抽象类DataOperator.

流程解析:客户端知晓适配器CipherAdapter类名称,通过父类DataOperator实例化一个CipheAdapter对象,CipheAdapter对象中包含Caesar对象,可通过Caesar调用其方法达到目的。

适配器模式优缺点:

 类适配器模式优点:

  • 将目标类和适配者类解耦
  • 增加了类的透明性和适用性
  • 灵活性和扩展性非常好
  • 可以在适配器中置换一些适配者的方法,使得适配器的灵活性更强

 类适配起的缺点:

  对于不支持多继承的语言,一次性最多适配一个抽象类,使用具有一定局限性

 对象适配器的优点:

  一个适配器可以把多个适配者适配到同一个目标

 对象适配器缺点:

  想要置换适配者类的方法比较麻烦。