结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示。
类适配器使用继承被适配类的方式进行适配。这时被适配类的实例和适配目标类的实例是同一个对象。面向适配目标的操作都会被转而调用实例自身的继承自被适配类的方法。
对象适配器依赖于对象组合,如下图所示。
对象适配器是通过持有被适配类的对象的方式来进行适配,这时适配目标类的实例保持着被适配类的实例。面向适配对象的操作都会转而调用被适配类的方法。
参与者
• Target(Shape)
—定义Client使用的与特定领域相关的接口。这可以看作是目标类的需求。
• Client(DrawingEditor)
— 与符合Target接口的对象协同。适配器的利用者,没有什么特殊的要求。
• Adaptee(TextView)
— 定义一个已经存在的接口,这个接口需要适配。这句话可能需要商榷,因为那些接口需要适配并不决定于Adaptee有什么,而是决定于Target需要什么。
• Adapter(TextShape)
— 对Adaptee的接口与Target接口进行适配。真正执行适配工作的类,有类适配和对象适配两种方式。
协作
• Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。
Adapter接口利用者的请求,将其转发给Adaptee。
作者观点
类适配和对象适配的区别本质上还是Has A和Is A之争。
注:
本文中
蓝 {MOD}粗体文字都引自《设计模式》一书。
觉得本文有帮助?请分享给更多人。