Skip to content

Latest commit

 

History

History
75 lines (56 loc) · 2.89 KB

适配器.md

File metadata and controls

75 lines (56 loc) · 2.89 KB

适配器 Adapter

背景

例如:不同国籍的人交流需要翻译;同样的用电器,在国内和国外需要不同的适配器匹配电压。为了使可控范围外的一个原有对象可以满足我们的期望。

定义

将某个类的接口转换成client期望的另一种接口表示。

难点 & 关键

通常有两种,一种是通过继承实现的类适配器,另一种是通过组合实现的对象适配器。

  1. 类适配器 - 基于多重继承

适配器类公有继承目标类,以保持接口一致;私有继承被适配类,以调用被适配类中的方法并隐藏它。

  1. 对象适配器 - 基于组合

仍然公有继承目标类;声明(持有)一个私有对象以获取被适配类中的方法。

要素

  • 私有继承或私有声明。
  • 在接口方法(request)中调用被适配类(Adaptee)的方法。
  • 使用时,ClientTarget* apt = new Adapter();

优点

  • client只需要知道ClientTarget中的接口,这个接口是稳定的(被适配类是不稳定的,可变的),封闭了变化。

比较类适配器和对象适配器

类适配器 对象适配器
特点 1.用一个具体的适配器类对源对象和客户端目标进行匹配。
2.适配器可以override(重定义/覆盖)源对象(adaptee)的部分行为>
1.允许适配器与多个源对象(adaptee)(及其子类)同时工作。
2.Adapter也可以用组合的方式给所有源对象添加功能。
不足 1.因为是继承,所以需要**多重继承**的支持;
2.当想要匹配一个类以及其子类时, 类适配器不可用
1.无法override(重定义/覆盖)源对象的行为
强行这么做的办法是: 先做apdatee的子类, 然后对这个子类 用类适配器来适配

适用环境

  1. 系统需要使用现有的类,但这些类的接口不符合系统的需求。
  2. 想要建立一个可以重复使用的类,用于与一些彼此之间关联不大的类,包括会在未来引进的类一起工作。
  3. 需要一个统一的输出接口,而输入接口不可预知

实例: 在系统升级的时候经常用到。

总的来说可以概括为: 系统的数据和行为正确,但接口不符时

Tips: **事后控制不如事中控制,事中控制不如事前控制。**适配器模式不要乱用:

在有小的接口不统一问题发生时,及时重构,问题不至于扩大;
只有碰到无法改变原有设计和代码的情况时,才考虑适配。