1. 适配器模式
适配器模式(Adapter Pattern)是结构性设计模式,其目的是协调不兼容的结构,把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式包括了类的适配器模式和对象的适配器模式,尤其是对象的适配器模式,它是其它结构性设计模式的起源。结构性设计模式一共7种,分别是适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
适配器模式的角色一共有三种。
Target(目标类): 客户端需要的接口,可以是一个抽象类或接口,也可以是具体类。
Adaptee(适配者类): 被适配的角色,由于不是客户端期待的接口,需要被适配。
Adapter(适配器类): 适配器把源接口转换成目标接口,对Target和Adaptee进行适配,是适配器模式的核心。
2. 构建者模式举例
2.1 类的适配器模式
类适配器模式中适配器和适配者是继承关系。
当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
类的适配器模式中,只能适配一种适配者(Adaptee),因为只能java只允许继承一个类。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | Target | Target | 目标类 |
2 | Adaptee | Adaptee | 适配者类,被适配的角色 |
3 | Adapter | Adapter | 适配器类 |
4 | Client | 客户端 | 演示调用 |
1. Target 目标类
/**
* 目标类,定义客户需要的接口。
*/
public interface Target {
// 连接USB接口
public void ConnectUsb();
// 给手机充电
public void chargePhone();
}
2. Adaptee 适配者类,源类
/**
* 适配者类,被适配的角色。
*/
public class Adaptee {
public void charge(){
System.out.println("接通 220V 电源");
}
}
3. Adapter 适配器
/**
* 适配器类,是适配器模式的核心,对Adaptee和Target进行适配。
* <p>
* 类的适配器模式中,只能适配一种适配者(Adaptee),因为只能java只允许继承一个类。
*/
public class Adapter extends Adaptee implements Target {
@Override
public void ConnectUsb() {
System.out.println("连接USB");
}
// 把220V的电源适配成5V的。
@Override
public void chargePhone() {
charge();
System.out.println("接通 5V 的电源");
}
}
4. Client 客户端
/**
* 客户端需要的是5V的电源,Adaptee提供的是220V的电源,因此需要适配。
*/
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.ConnectUsb(); // 连接USB
target.chargePhone(); // 充电
}
}
2.2 对象的适配器模式
对象的适配器模式,和上面的类的适配器模式的不同点在于适配器类,对象适配器模式中适配器和适配者之间是关联关系。
当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Adapter(或者叫Wrapper)类,持有原类的一个实例,在Adapter类的方法中,调用实例的方法。
/**
* 适配器类,是适配器模式的核心,对Adaptee和Target进行适配。
* <p>
* 本例是对象的适配器模式,即Adapter持有Adaptee实例,而不是继承。
* 这样依赖适配器就可以适配更多的Adaptee。
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void ConnectUsb() {
System.out.println("连接USB");
}
// 把220V的电源适配成5V的。
@Override
public void chargePhone() {
adaptee.charge();
System.out.println("接通 5V 的电源");
}
}
3. 适配器模式总结
适配器模式是结构性设计模式,通过适配器类(Adapter),形成了更大的类的结构。
优点:
将目标类(Target)和适配者(Adaptee)解耦,具有良好的灵活性和扩展性,客户端对此毫无所知。
缺点:
类适配器模式只能适配一个Adaptee,因为java不允许多继承,而且Adaptee类不能是final的。
(完)