适配器模式概述
笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容,引入一个电源适配器一样引入一个称之为适配器的角色来协调这些存在不兼容的结构,这种设计方案即为适配器模式。
适配器模式优缺点
优点
- 一个对象适配器可以把多个不同的适配者适配到同一个目标
- 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。
缺点
- 对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
- 适配者类不能为最终类,如在Java中不能为final类,C#中不能为sealed类;
- 在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
三种适配器模式
由于Java不支持多继承,所以运用较少
持有需要适配的目标对象,较为常用
JDK中的WindowAdapter
示例
电脑的电源适配器和插座,使用适配器模式实现。
示例代码
//电脑类,设配目标(Target)
public class Computer{
public void connectWith20V(){
System.out.println("20V充电");
}
}
//插座,国内插座220V
public interface Socket {
void supplyWith220V();
}
//类适配器模式
public class ChargerAdapter extends Computer implements Socket {
@Override
public void supplyWith220V() {
System.out.println("连接220V插座");
super.connectWith20V();
}
}
//对象适配器模式
public class Charger2Adapter implements Socket{
private Computer computer;
public Charger2Adapter(Computer computer) {
this.computer = computer;
}
@Override
public void supplyWith220V() {
System.out.println("连接220V插座");
computer.connectWith20V();
}
}
//接口适配器(缺省适配器)
public class Charger3Adapter extends ComputerAdapter {
private Computer computer;
@Override
public void supplyWith220V() {
super.supplyWith220V();
}
public void connectWith20V() {
this.supplyWith220V();
computer.connectWith20V();
}
public void setComputer(Computer computer) {
this.computer = computer;
}
}
//调用
public static void main(String[] args) {
//类适配器
//Socket socket = new ChargerAdapter();
//socket.supplyWith220V();
//对象适配器
//Computer computer = new Computer();
//Socket socket2 = new Charger2Adapter(computer);
//socket2.supplyWith220V();
//接口适配器(缺省适配器)
//Computer computer = new Computer();
//Charger3Adapter charger3Adapter = new Charger3Adapter();
//charger3Adapter.setComputer(computer);
//charger3Adapter.connectWith20V();
}
网友评论