适配器模式
简介
适配器模式(Adapter Pattern)是指将一个类的接口转换成客户端希望的另一个接口,使原本因接口不兼容而不能一起工作的类可以一起工作。
角色组成
- Target (目标接口): 定义了客户端代码所使用的特定领域接口。这是客户端期望与之交互的接口。
- Client (客户端): 与符合 Target 接口的对象进行交互。客户端不知道也不关心它实际使用的是不是一个适配器。
- Adaptee (被适配者): 一个已经存在的类,但它的接口与 Target 接口不兼容。这是需要被适配的类。
- Adapter (适配器): 实现 Target 接口,并持有 Adaptee 的一个实例(对象适配器)或继承自 Adaptee 和 Target(类适配器,在 Python 中不常用)。它负责将来自客户端对 Target 接口的调用转换成对 Adaptee 接口的调用。
两种主要形式:
- 对象适配器 (Object Adapter): 适配器持有(组合)一个被适配者(Adaptee)的实例。这是更常用、更灵活的方式,尤其是在 Python 中,因为它优先使用组合而非继承。
- 类适配器 (Class Adapter): 适配器通过多重继承,同时继承 Target 接口(或类)和 Adaptee 类。Python 支持多重继承,但这种方式耦合度更高,不够灵活。
适用场景
- 使用一个已经存在的类,但其接口与你的需求不匹配时。 这是最典型的场景,比如集成第三方库或遗留代码。
- 希望创建一个可复用的类,该类可以与一些接口不兼容的类 协同工作时。 适配器可以使这些不相关的类能够一起工作。
- 需要适配 Adaptee 的不同子类,但不想为每个子类都创建一个适配器时。 对象适配器可以通过持有 Adaptee 的父类引用来与 Adaptee 的所有子类工作。
- 当你无法修改 Adaptee 源代码,但又需要让它适配新的接口时。
优点
- 代码复用: 可以复用现有的 Adaptee 类,而无需修改其源代码。
- 解耦: 将客户端与具体的 Adaptee 实现解耦。客户端仅依赖于 Target 接口。
- 单一职责原则: 接口转换的逻辑被封装在适配器中,使得 Adaptee 和 Client 的代码保持简洁,职责单一。
- 灵活性(对象适配器):
- 一个适配器可以适配 Adaptee 及其所有子类。
- 可以在将请求委派给 Adaptee 对象之前或之后轻松添加新功能。
缺点
- 增加系统复杂度: 引入了额外的适配器类,使得系统中的类数量增加,代码整体复杂度有所提高。
- 额外的代码: 需要编写额外的适配器代码来完成接口的转换。
- 可能掩盖问题: 过度使用适配器有时可能掩盖了系统设计本身的不合理性(例如,接口定义混乱)。