类图+案例+代码详解:软件设计模式----适配器模式
7、适配器模式
是为了解决接口不一致的问题。
类适配器:适配器Adapter需要实现目标接口Target(声明所有需要的方法),并继承被适配类Adaptee。由于Adapter继承了Adaptee,所以Adapter只需要实现Target中Adaptee所拥有的以外的方法。
但是,在java中一个类不允许有两个直接超类,所以当有两个或两个以上的类Adaptee需要被适配时,就不能继续使用类适配器。
对象适配器(推荐):与类适配器基本相同,不同的是,Adapter实现Target中的所有方法(Operation1和Operation2),不再有继承于Adaptee的方法。但是,对于Target的Operation1的实现,是通过在Operation1方法里调用Adaptee声明的方法Operation1,以此来实现适配功能。当有多个Adaptee时,也就不会有多继承发生。
Adapter与Adaptee是聚合关系。
代码示例:充电接口的适配
场景:手机需要通过 USB 接口充电,但现有电源是圆孔接口。
1. 定义目标接口(USB 接口)
// 目标接口:手机需要的USB充电接口
interface USBCharger {void chargeWithUSB(); // 用USB接口充电
}
2. 定义适配者(圆孔电源接口)
// 适配者:现有的圆孔电源接口
class RoundHolePower {public void supplyWithRoundHole() {System.out.println("通过圆孔接口供电");}
}
3. 实现适配器(转换插头)
// 适配器:将圆孔接口转换为USB接口
class PowerAdapter implements USBCharger {private RoundHolePower power; // 持有适配者的引用public PowerAdapter(RoundHolePower power) {this.power = power;}@Overridepublic void chargeWithUSB() {System.out.println("适配器开始工作:");power.supplyWithRoundHole(); // 调用适配者的方法System.out.println("转换为USB接口,手机开始充电");}
}
4. 使用适配器
public class AdapterDemo {public static void main(String[] args) {// 1. 创建适配者(圆孔电源)RoundHolePower power = new RoundHolePower();// 2. 创建适配器,传入适配者USBCharger adapter = new PowerAdapter(power);// 3. 通过目标接口使用适配器adapter.chargeWithUSB();}
}