1. 概述
你需要使用某个类(Adaptee),但是某个类不符合某个接口(Target),使用适配器(Adapter)对Adaptee和Target进行适配。
2. 解决的问题
即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。Adapter 对Adaptee的接口与Target接口进行适配
3. 模式中的角色
3.1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
3.2 需要适配的类(Adaptee):需要适配的类。
3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
图 1. 适配器模式类图
图 1 所示是适配器模式的类图。Adapter 适配器设计模式中有 3 个重要角色:被适配者 Adaptee,适配器 Adapter 和目标对象 Target。其中两个现存的想要组合到一起的类分别是被适配者 Adaptee 和目标对象 Target 角色,按照类图所示,我们需要创建一个适配器 Adapter 将其组合在一起。
4 适用场景
- 你想使用一个已经存在的类,而它的接口不符合你的需求(目标接口)
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口 可能不一定兼容的类)协同工作
5. 实现方式
(1)类的适配器模式(采用继承实现)
(2)对象适配器(采用对象组合方式实现)
(1)适配器类Adapter 继承 被适配类Adaptee 实现 目标接口 Target
// 目标接口,或称为标准接口 interface Target { public void request(); } // 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee { public void specificRequest() { System.out.println("被适配类具有 特殊功能..."); } } // 适配器类,继承了被适配类,同时实现标准接口 class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); } } //测试类 public class Client { public static void main(String[] args) { Target adapter = new Adapter(); adapter.request(); } }
上面这种实现的适配器称为类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。
另外一种适配器模式是对象适配器,它不是使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式
(2)适配器类Adapter 关联 被适配类Adaptee对象 实现 目标接口 Target
//目标接口,或称为标准接口 interface Target { public void request(); } //已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee { public void specificRequest() { System.out.println("被适配类具有 特殊功能..."); } } //适配器类,关联被适配类,同时实现标准接口 class Adapter implements Target{ private Adaptee adaptee; //关联被适配类 public Adapter (Adaptee adaptee) { //可以通过构造函数传入具体需要适配的被适配类对象 this.adaptee = adaptee; } //这里使用委托的方式完成特殊功能 public void request() { this.adaptee.specificRequest(); } } //测试类 public class Client { public static void main(String[] args) { // 创建一个被适配类的对象作为参数传入适配器类的构造函数 产生关联 Target adapter = new Adapter(new Adaptee()); adapter.request(); } }