引言
本文属于作者笔记,知识点来自《设计模式》。
意图
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
动机
有时,为复用而设计的工具箱类不能够被复用仅仅是因为它的接口与专业应用领域所需如要的接口不匹配。
例如,有一个绘图编辑器,这个编辑器允许用户绘制和排列基本图元(线、多边形和文本等)来生成图片和图表。这个绘图编辑器的关键抽象是图形对象。图形对象有一个可编辑加适的形状,并可以绘制自身。图形对象的接口由一个称为 Shape的抽象类定义。绘图编辑器为每一种图形对象定义了一个 Shape的子类: Line Shape类对应于直线, PolygonShape类对应以下于多边形,等等。
像 LineShape和 Polygon Shape这样的基本几何图形的类比较容易实现,这是由于它们的绘图和编辑功能本来就很有限。但是对于可以显示和编辑文本的 TextShape子类来说,实现相当困难,因为即使是基本的文本编辑也要涉及复杂的屏幕刷新和缓冲区管理。同时,成品的用户界面工具箱可能已经提供了一个复杂的 Text View类用于显示和编辑文本。理想的情况是我们可以复用 TextView类以实现 TextShape类,但是工具箱的设计者当时并没有考虑到Shape的存在,因此 Text View和 Shape对象不能互换。
一个应用可能会有一些类具有不同的接口并且这些接口互不兼容,在这样的应用中像Text View这样已经存在并且不相关的类如何协同工作呢?我们可以改变 Text view类使它兼容 Shape类的接口,但前提是必须有这个工具箱的源代码。然而即使我们得到了这些源代码,修改 Text view也是没有什么意义的,因为不应该仅仅为了实现一个应用,工具箱就不得不采用一些与特定领域相关的接口。
适用性
以下情况下使用 Adapter模式:
●你想使用一个已经存在的类,而它的接口不符合你的需求。
●你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
●(仅适用于对象 Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
结构
参与者
●Target( Shape )
定义Client使用的与特定领域相关的接口。
●Client( DrawingEditor)
与符合 Target接口的对象协同
●Adaptee(Text View)
定义一个已经存在的接口,这个接口需要适配。
●Adapter( TextShape)
对 Adaptee接口与 Target接口进行适配。
代码示例
package adapter;
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void A() {
adaptee.B();
}
}