例如:不同国籍的人交流需要翻译;同样的用电器,在国内和国外需要不同的适配器匹配电压。为了使可控范围外的一个原有对象可以满足我们的期望。
将某个类的接口转换成client期望的另一种接口表示。
通常有两种,一种是通过继承实现的类适配器,另一种是通过组合实现的对象适配器。
- 类适配器 - 基于多重继承
适配器类公有继承目标类,以保持接口一致;私有继承被适配类,以调用被适配类中的方法并隐藏它。
- 对象适配器 - 基于组合
仍然公有继承目标类;声明(持有)一个私有对象以获取被适配类中的方法。
要素
- 私有继承或私有声明。
- 在接口方法(request)中调用被适配类(Adaptee)的方法。
- 使用时,ClientTarget* apt = new Adapter();
- client只需要知道ClientTarget中的接口,这个接口是稳定的(被适配类是不稳定的,可变的),封闭了变化。
类适配器 | 对象适配器 | |
---|---|---|
特点 |
1.用一个具体的适配器类对源对象和客户端目标进行匹配。 2.适配器可以override(重定义/覆盖)源对象(adaptee)的部分行为> |
1.允许适配器与多个源对象(adaptee)(及其子类)同时工作。 2.Adapter也可以用组合的方式给所有源对象添加功能。 |
不足 |
1.因为是继承,所以需要**多重继承**的支持; 2.当想要匹配一个类以及其子类时, 类适配器不可用 |
1.无法override(重定义/覆盖)源对象的行为 强行这么做的办法是: 先做apdatee的子类, 然后对这个子类 用类适配器来适配 |
- 系统需要使用现有的类,但这些类的接口不符合系统的需求。
- 想要建立一个可以重复使用的类,用于与一些彼此之间关联不大的类,包括会在未来引进的类一起工作。
- 需要一个统一的输出接口,而输入接口不可预知。
实例: 在系统升级的时候经常用到。
总的来说可以概括为: 系统的数据和行为正确,但接口不符时
Tips: **事后控制不如事中控制,事中控制不如事前控制。**适配器模式不要乱用:
在有小的接口不统一问题发生时,及时重构,问题不至于扩大;
只有碰到无法改变原有设计和代码的情况时,才考虑适配。