1 定义:
1.1 定义:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces. (将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)
适配器模式与装饰模式都是包装模式(wrapper)。
1.2 通用类图:
Target目标角色:定义期望的接口;
Adaptee源角色:待转换的源角色;
Adapter适配器角色:通过继承或是类关联的方式,将源角色转换为目标角色。
1.3 通用代码:(下为类适配器模式)
public interface Target { // 目标角色有自己的方法 public void request(); } public class Adaptee { // 原有的业务逻辑 public void doSomething() { System.out.println("I'm kind of busy,leave me alone,pls!"); } } public class Adapter extends Adaptee implements Target { public void request() { super.doSomething(); } } public class Client { public static void main(String[] args) { // 原有的业务逻辑 Target target = new ConcreteTarget(); target.request(); // 现在增加了适配器角色后的业务逻辑 Target target2 = new Adapter(); target2.request(); } }
2 优点:[补救模式]
2.1 让两个没有任何关系的类在一起运行。
2.2 增加了类的透明性,高层模式并不知道源角色的实现;
2.3 提高了类的复用性,源角色在新旧两个系统都可以使用;
2.4 灵活性好,若某天不需要了,拆掉适配器即可。
3 缺点
暂无
4 应用场景
需要修改一个已经投产中的接口时,适配器模式可能是最适合的模式。
比如:系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口。
5 注意事项
最好不要在“详细设计阶段”考虑它,它不是为解决还处在“开发阶段的问题”,而是解决“正在服役的问题”。其主要场景是扩展应用。
此外,还要遵守依赖倒置原则和里氏替换原则,否则也会带来大面积的修改。
6 扩展
对于两个或两个以上类的适配,可以采用“对象适配器”方式,即通过对象关联达成。
7 范例
(对象适配器模式,变压器)
package _13_Adapter; public abstract class Power_5V { public abstract int output_5V(); } public class Power_220V { public int output_220V() { return 220; } } public class DownAdapter extends Power_5V { Power_220V p220; public DownAdapter(Power_220V power) { p220 = power; } @Override public int output_5V() { return p220.output_220V() / 44; } } public class Client { public static void main(String[] args) { Power_220V p220 = new Power_220V(); Power_5V p5 = new DownAdapter(p220); System.out.println("输入电压:" + p220.output_220V() + " 输出电压:" + p5.output_5V()); } }
输出结果:
输入电压:220 输出电压:5