一.模式定义
对象结构型模式,类结构型设计模式。
适配器模式:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。
Adapter Pattern: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
二.模式要素
1.Target:目标抽象类
2.Adapter:适配器类
3.Adaptee:适配者类
4.Client:客户类
三.举例说明
电脑充电器大家一定见过,其实它就是一种非常典型的适配器。国内的家用插座电压统一是220V。那如果直接将220V的电压通到你的笔记本电脑里估计电脑会炸,所以必须使用电源适配器使得电压能够降到5V,这样才能给电脑正常使用。
其实适配器的实现分为两种:类适配器、对象适配器。
1.类适配器模式
2.对象适配器模式
四.模式实例
1.类适配器模式实例
Voltage220V.java 220V电压类
public class Voltage220V {
int voltage = 220;
public int supplyVoltage220V() {
return voltage;
}
}
Voltage5V.java 5V电压接口
public interface Voltage5V {
public int supplyVoltage5V();
}
VoltageAdapter.java 类适配器
public class VoltageAdapter extends Voltage220V implements Voltage5V {
@Override
public int supplyVoltage5V() {
int initialVoltage = supplyVoltage220V();
System.out.println("开始适配电压,初始电压为" + initialVoltage + "V");
int realVolatege = initialVoltage / 44;
System.out.println("适配电压结束,真实电压为" + realVolatege + "V");
return realVolatege;
}
}
Main.java 调用者
public class Main {
public static void main(String[] args) {
// 无需适配电压
Voltage220V voltage220V = new Voltage220V();
int voltage1 = voltage220V.supplyVoltage220V();
System.out.println("当前电压为" + voltage1 + "V" + "\n");
// 适配电压
VoltageAdapter adapter = new VoltageAdapter();
int voltage2 = adapter.supplyVoltage5V();
System.out.println("当前电压为" + voltage2 + "V");
}
}
运行结果:
2.对象适配器模式实例
VoltageAdapter2.java
public class VoltageAdapter2 implements Voltage5V {
private Voltage220V voltage220V;
public VoltageAdapter2(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int supplyVoltage5V() {
int realVoltage = 0;
if(voltage220V != null) {
int initialVoltage = voltage220V.supplyVoltage220V();
System.out.println("开始适配电压,初始电压为" + initialVoltage + "V");
realVoltage = initialVoltage / 44;
System.out.println("适配电压结束,真实电压为" + realVoltage + "V");
}
return realVoltage;
}
}
Main.java
public class Main {
public static void main(String[] args) {
// 无需适配电压
Voltage220V voltage220V = new Voltage220V();
int voltage1 = voltage220V.supplyVoltage220V();
System.out.println("当前电压为" + voltage1 + "V" + "\n");
// 适配电压
// VoltageAdapter adapter = new VoltageAdapter();
// int voltage2 = adapter.supplyVoltage5V();
// System.out.println("当前电压为" + voltage2 + "V");
// 适配电压
VoltageAdapter2 voltageAdapter2 = new VoltageAdapter2(new Voltage220V());
int voltage3 = voltageAdapter2.supplyVoltage5V();
System.out.println("当前电压为" + voltage3 + "V");
}
}
运行结果:
五.总结
1.适配器模式的优点
(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
(2)增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
(3)灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
类适配器优点:
中由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
对象适配器优点:
可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
2.适配器模式的缺点
类适配器缺点:
对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。
对象适配器缺点:
与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。
3.适配器模式的适用场景
(1)系统需要使用现有的类,而这些类的接口不符合系统的需要。
(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。