基本介绍
著名的设计模式“四人帮”这样评价适配器模式:
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four
适配器模式将一个类的接口适配成用户所期待的。一个适配器通常允许因为接口不兼容而不能一起工作的类能够在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
Adapter 设计模式主要目的组合两个不相干类,常用有两种方法,第一种解决方案是修改各自类的接口。但是如果没有源码,或者不愿意为了一个应用而修改各自的接口,则需要使用 Adapter 适配器,在两种接口之间创建一个混合接口。
图 1. 适配器模式类图

图 1 所示是适配器模式的类图。Adapter 适配器设计模式中有 3 个重要角色:被适配者 Adaptee,适配器 Adapter 和目标对象 Target。其中两个现存的想要组合到一起的类分别是被适配者 Adaptee 和目标对象 Target 角色,按照类图所示,我们需要创建一个适配器 Adapter 将其组合在一起。
具体实现代码请见清单 1-4。
清单 1. 客户端使用的接口
1 2 3 4 5 6 7 8 9 | /* * 定义客户端使用的接口,与业务相关 */ public interface Target { /* * 客户端请求处理的方法 */ public void request(); } |
清单 2. 被适配的对象
1 2 3 4 5 6 7 8 9 10 11 | /* * 已经存在的接口,这个接口需要配置 */ public class Adaptee { /* * 原本存在的方法 */ public void specificRequest(){ //业务代码 } } |
清单 3. 适配器实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* * 适配器类 */ public class Adapter implements Target{ /* * 持有需要被适配的接口对象 */ private Adaptee adaptee; /* * 构造方法,传入需要被适配的对象 * @param adaptee 需要被适配的对象 */ public Adapter(Adaptee adaptee){ this.adaptee = adaptee; } @Override public void request() { // TODO Auto-generated method stub adaptee.specificRequest(); } } |
清单 4. 客户端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* * 使用适配器的客户端 */ public class Client { public static void main(String[] args){ //创建需要被适配的对象 Adaptee adaptee = new Adaptee(); //创建客户端需要调用的接口对象 Target target = new Adapter(adaptee); //请求处理 target.request(); } } |
以下情况比较适合使用 Adapter 模式:
当你想使用一个已经存在的类,而它的接口不符合你的需求;
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作;
你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父亲接口。