模式名称: 适配器-Adapter,又称包装器-Wrapper
类型: 结构型
问题-使用场景: 适配器可以让原本由于接口不兼容而不能一起工作的类可以重新一起工作
解决方案:使用适配器对象对原本的类进行继承或者对类的对象进行组合并调用接口两种方式
效果:在无需知晓,且不改变已有类的源码的前提下,使系统能够耦合在一起进行工作

实现方式

Adapter主要有两种实现方式。

  1. 继承
  2. 组合

两种方式各有利弊,虽然可能组合方式居多

应用举例

现在我们要做一个绘图编辑器,我们用Shape抽象类规定了子类控件的行为,而我们又有了一个成品的工具类TextView,它本身提供了显示文本的接口,但我们不知道它的源码,或者不愿意修改它的源码,因此我们无法让TextView满足Shape的规定接口要求,二者无法直接一起工作。

所以为了复用TextView,我们可以选择使用适配器模式,构造一个TextShape子类继承自Shape,同时组合了一个TextView实例化出的对象text,这样也可以调用TextView里的接口。这样通过TextShape作为适配器,我们成功地让接口能够间接兼容了。

下图为例子的类图,其中Line类只是体现继承关系,与适配器模式无关

适用范围

  • 想使用一个已存在的类,而它的接口不符合要求
  • 想创建一个可复用的类,该类可以与其它不相关的类或不可见的类协同工作
  • 在继承关系中,对针对父类接口进行适配器适配,用以减少对每个子类进行适配的冗余操作

两种实现方式的结构

  • 多继承实现

  • 组合实现

参与者

  • Target
    • 提供与Client交互的接口
  • Client
    • 系统的交付对象
  • Adaptee
    • 定义一个已经存在的接口,且这个接口待适配
  • Adapter
    • Adaptee的接口与Target的接口进行适配