Adapter(适配器)–类对象结构型模式
一、意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作。
二、动机
1.在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
2.如果应对这种“迁移的变化”?如何能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?
三、适用性
1.你想使用一个已经存在的类,而它的接口不符合你的需求。
2.你想创建一个可以复用的类,该类可以与其他不相关的类或者不可见的类(即那些接口可能不一定兼容的类)协同工作。
3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每个一都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
四、结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,入下图所示。
对象匹配器依赖对象组合,如下图所示。
五、效果
类适配器和对象适配器有不同的权衡。类适配器
1.用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类似及所有它的子类时,类Adaptee将不能胜任工作。
2.使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
3.仅引入了一个对象,并不需要额外的指针以间接得到adaptee。
对象适配器则
1.允许一个Adapter与多个Adpatee——即Adaptee本身以及它的所有子类(如果有子类的话)——同时工作。Adapter也可以一次给所有的Adpatee添加功能。
2.使得重定义Adaptee的行为比较困难。这就是需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
六、实现
1.使用C++实现适配器类
2.可插入的适配器
七、要点总结
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一样的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.类适配器采用“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
3.Adapter模式可以实现的非常灵活,不必拘泥于定义中的两个结构(类模式、对象模式)。
八、相关模式
模式Bridge的结构与对象适配器类似,但是Bridge模式的出发点不同:Birdge目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而Adpater则意味着改变一个已有对象的接口。
Decorator模式增强了其他对象的功能而同时又不改变它的接口。因此decorator对应程序的透明性比适配器要好。结果是decorator支撑递归组合,而纯粹使用适配器是不可能实现这一点的。
模式Proxy在不改变它的接口条件下,为另一个对象定一个了一个代理。
九、举例说明
适配器模式相当于现实中的转接头。就是为适配接口而产生的。
本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解