1.定义:
适配器模式是将一个类的接口转换成客户端希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构与说明:
Client:客户端,调用自己需要的领域接口Target。
Target:定义客户端需要的跟特定领域相关的接口。
Adaptee:已经存在的接口,但与客户端需要的特定领域接口不一致,需要被适配。
Adapter:适配器,把Adaptee适配成Client需要的Target。
2.代码示例
(1)已经存在的应用接口,需要被适配的类Adaptee
1 package com.apdater.example1; 2 /** 3 * 将要被适配的系统接口 4 * @author admin 5 * 6 */ 7 public class Adaptee { 8 9 public void specificRequest(){ 10 11 } 12 }
(2)客户端特定领域的接口
1 package com.apdater.example1; 2 /** 3 * 客户端特定领域的接口 4 * @author zhaohelong 5 * 6 */ 7 public interface Target { 8 public void request(); 9 }
(3)适配器
1 package com.apdater.example1; 2 /** 3 * 适配器 4 * @author admin 5 * 6 */ 7 public class Adapter implements Target { 8 9 /** 10 * 持有需要被适配的对象 11 */ 12 private Adaptee adaptee; 13 /** 14 * 构造方法,传入需要被适配的对象 15 * @param adaptee 16 */ 17 public Adapter(Adaptee adaptee){ 18 this.adaptee=adaptee; 19 } 20 /** 21 * 处理方法 22 */ 23 @Override 24 public void request() { 25 //可转调已经存在的方法进行适配 26 adaptee.specificRequest(); 27 } 28 29 }
(4)客户端的调用
1 package com.apdater.example1; 2 3 public class Client { 4 public static void main(String[] args) { 5 //创建需要适配的对象 6 Adaptee adaptee=new Adaptee(); 7 //创建适配器 8 Target t=new Adapter(adaptee); 9 //发送请求 10 t.request(); 11 } 12 }
3.体会适配器模式
场景:假如需要同时支持数据库和文件的日志管理
1)日志管理第一版
在第一版的时候用户要求日志已文件形式记录。
2)日志管理第二版
要采用数据库来实现日志管理。
存在问题:现在的客户端无法直接使用第一版的实现。
这个时候如果使用适配器模式的话,我们就可以很容易将两个版本结合起来一起使用。
4.理解适配器模式
1、适配器模式的功能
适配器模式的主要功能是转换匹配,目的是复用已有的功能,而不是实现新的接口。
适配器也可以实现功能,这种适配器称为智能适配器。
2:Adapteee和Target的关系
适配器模式中的被适配对象与目标适配的对象之间没有关系。
3:对象组合
适配器的一般实现方式是对象组合方式。
5.适配器模式的实现
1:适配器模式的常见实现
适配器通常是一个类,一般会让适配器去实现Target接口,然后在适配器的具体实现里调用Adaptee
2:智能适配器实现
可以在适配的实现里面加入新的功能,这样的适配器叫做智能适配器。
3:适配多个Adaptee
4:适配Adapter的实现复杂度
取决于Adaptee与Target的相似程度。
6.双向适配器
适配器在实现接口的时候同时实现Adaptee和Target的接口,这样可以实现两个版本互用。
7.权衡类适配器和对象适配器
1:从实现上:类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用的是对象组合的方式,是动态的定义方式。
2:对于类适配器:由于适配器直接继承了Adaptee,使得适配器不能与Adaptee的子类一起工作,因为继承是个静态的关系,当适配器继承Adaptee过后,就不能再去处理Adaptee的子类了。
对于对象适配器:允许一个Adapter和多个Adaptee,包括Adaptee和他的所有子类一起工作,因为对适配器采用的是对象组合关系,只要类型正确,是不是子类关系都无所谓。
3:对于类适配器:适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。
对于对象适配器:要重定义Adaptee的的部分行为很难实现,这个时候,可以定义Adaptee的子类来重定义Adaptee的行为,然后采用对象组合的方式来实现。
8.适配器模式的优缺点
1:更好的复用性
2:更好的可扩展性
3:过多的使用适配器模式会让系统凌乱,不容易整体把握。
9.适配器模式的本质
转换匹配,复用功能。
10.合适选用适配器模式
1:如果你想要使用一个已经存在的类,但是它的接口不符合需求,这个时候可以选用适配器模式,将接口转换成你需要的。
2:如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这个时候可以选用适配器模式,到时候需要什么就适配什么。
3:如果你想使用一个已经存在的子类,但是不可能对每一个子类都进行适配,那么这个时候可以选用对象适配器,直接将子类的父类适配就可以了。