定义:将一个类的接口转化成客户端希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要功能是进行转换匹配,从而可以复用已有的功能。通过给适配器对象组合被适配的对象,然后当客户端调用Target时,适配器会将相应的功能委托给被适配的对象去完成。生活中的适配器模式很常见,比如电压转换器、翻译等。
适配器模式中的3个角色
Target 目标角色
该角色定义把其他类转换为何种接口,也就是期望接口。1
2
3public interface Target{
public void request();
}目标角色的实现类:
1
2
3
4
5public class ConcreteTarget implements Target{
public void request(){
System.out.println("ConcreteTarget doing...");
}
}Adaptee 源角色
想把谁转换成目标角色,这个“谁”就是源角色。它是已经存在的、运行良好的类或对象,经过适配器的包装,成为一个新的角色。1
2
3
4
5public class Adaptee{
public void doSomething(){
System.out.println("Adaptee doing...");
}
}Adapter 适配器角色
核心角色,其他两个角色都是已经存在的,而适配器角色是需要新建的。它的职责就是把源角色转换为目标角色。1
2
3
4
5public class Adapter extends Adaptee implements Target{
public void request(){
super.doSomething();
}
}场景类
1
2
3
4
5
6
7
8
9
10public class Client{
public static void main(String[] args){
//原有的业务逻辑
Target target = new ConcreteTarget();
target.request();
//现在增加了适配器角色后的业务逻辑
Target target2 = new Adapter();
target2.request();
}
}
适配器的实现
适配器通常是一个类,一般或让其去实现Target接口,然后再其具体实现里面调用Adaptee。
类的适配器模式
当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类Adaptee,实现新的接口即可。
对象的适配器模式
当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Adapter类,持有原类Adaptee的一个实例,在Adapter类的方法中,调用实例的方法就行。
接口的适配器模式
当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter,实现所有方法,我们写别的类的时候,继承抽象类即可。
适配器模式的调用顺序
优缺点
优点
- 更好的复用性
- 刚好的可扩展性
缺点
- 过多地使用会让系统非常混乱,很难从整体进行把握。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
何时使用适配器
适配器模式的本质是:转换匹配,复用功能。通过转换已有的功能实现,从而可以将其匹配成所需的接口。转换匹配是手段,复用功能是目的。
- 想使用一个已存在的类,但它的接口不符合需求时。或者是它不能对每一个子类都进行适配,这种情况下可以使用对象适配器,直接适配这些子类的父类。
- 想创建一个可复用的类,但是这个类可能会与一些类不兼容时
本文是《研磨设计模式》的读书笔记。