1 定义:
适配器模式(Adapter)
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)。
在现实生活中,像这种适配器我们经常见到,而且还是经常使用它,如:手机(深信大家都见过),我们手机在充电的时候,不可能直接在220V电源上直接充电,而是手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个“充电器”就起到了适配的作用。
1.1 通用类图:
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
- 客户端(Client):与符合Target接口的对象协同。
1.2 通用代码:
(下为类适配器模式,其中对象适配器和接口适配器在《Java设计模式概述》文中已存在,此处不再贴出代码)
- 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