1. 原理概述
适配器模式的定义
在软件设计中,适配器模式通过把一个接口转换成客户端所期望的另一种接口,实现了“接口不兼容”的对象协作。
它的核心思想是解耦调用方与实现方,通过一个适配器将两端的通信协议桥接起来,保持系统的高内聚与低耦合。
适配器模式的动机与场景
当你需要复用现有的类库,但其接口与当前代码基准不匹配时,适配器模式提供了一个无缝的接入方案。
典型场景包括对旧接口的逐步替换、第三方组件接入、以及跨模块的接口统一化,这些都能从封装性提升和代码清晰度上受益。
2. 工作原理与解耦
核心角色
在设计模式的语义中,通常涉及三个角色:目标(Target)、被适配者(Adaptee)、以及 适配器(Adapter)。
目标定义了客户端期望的接口,Adaptee 提供现有的实现,而 Adapter 则实现目标接口并委托给 Adaptee。

工作过程
客户端通过目标接口发起调用,适配器在内部把请求转换成被适配者可以处理的形式,再把结果返回给客户端。
这一过程实现了接口转换而不改动被适配者的实现代码,常见的还有运行时绑定和多态性支持。
3. 实现方式:对象适配器与类适配器
对象适配器
对象适配器通过组合(聚合)被适配者对象来实现接口转换,增强了灵活性与可替换性。
它允许在运行时改变被适配者,没有对现有类的结构修改,更符合开闭原则。
类适配器
类适配器通过多继承或混入方式实现目标接口与被适配者的组合关系。
在某些语言中,类适配器通过多继承实现,在编译时绑定提供的接口,通常对被适配者的复用更高效,但会带来与语言特性绑定的限制。
4. 封装实现的要点与设计注意
封装策略
封装实现的核心在于把具体的适配逻辑放在Adapter,让客户端只暴露统一的 Target 接口。
通过隐藏被适配者的内部实现,可以降低系统耦合度,提升可测试性和替换成本。
接口设计
目标接口应简洁、稳定,尽量保持向后兼容,以便对接多种 Adaptee 实现。
在设计上,可以引入统一的异常处理策略,以避免不同适配者抛出的异常影响客户端。
性能与可维护性
适配器模式的引入会带来额外的调用层,要关注调用开销,并进行必要的性能评估。
代码组织上,保持 Adapter 的职责单一,避免在同一类中混合过多转换逻辑。
5. 代码示例:从设计到实现
示例一:简单接口转换
下面给出一个经典的 Java 实现,展示 Target、Adaptee 与 Adapter 的关系。
// Target 接口,客户端希望的统一接口
public interface Target {void request();
}// Adaptee 提供现有的实现但接口不兼容
public class Adaptee {public void specificRequest() {System.out.println("Adaptee specificRequest");}
}// 通过对象适配器实现 Target
public class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {// 将请求转换为 Adaptee 可以处理的形式adaptee.specificRequest();}
}
通过上述实现,客户端只需要依赖Target,而不关心 Adaptee 的具体接口。
示例二:类适配器的对比
在某些语言中,可以使用多重继承实现类适配器,下面示例仅作对比说明。
// 注意:Java 不支持多继承,请以示例二的伪代码描述为参考
public class ClassAdapter extends Adaptee implements Target {@Overridepublic void request() {specificRequest();}
}


