适配器模式
1、定义
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2、适配器模式结构
- Target(目标抽象类):定义客户所需要的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Java不支持多重继承,所以只能是接口。
- Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。是适配器模式的核心。
- Adaptee(适配者类):被适配的角色,它定义了一个已经存在的接口。一般是一个具体类,包含了客户希望使用的业务方法。
- Client: 与符合Target接口的对象协同。
3、示例代码
假设我们要开发一个警车类,有移动、警灯和鸣笛三个功能。现在已经有开发好的警灯类和警笛类,现在就需要一个适配器来让几个类能一起工作
Target 创建CarController抽象类,定义方法
public abstract class CarController {
public void move() {
System.out.println("移动");
}
public abstract void phonate(); //发出声音
public abstract void twinkle(); //闪灯
}
Adaptee 需要被适配的警灯类和警笛类
public class PoliceSound {
public void alarmSound() {
System.out.println("鸣警笛");
}
}
public class PoliceLamp {
public void alarmLamp() {
System.out.println("闪警灯");
}
}
Adapter 适配器类PoliceCarAdapter
public class PoliceCarAdapter extends CarController{
private PoliceLamp lamp;
private PoliceSound sound;
public PoliceCarAdapter() {
lamp = new PoliceLamp();
sound = new PoliceSound();
}
@Override
public void phonate() {
sound.alarmSound();
}
@Override
public void twinkle() {
lamp.alarmLamp();
}
}
Client
public class Client {
public static void main(String[] args) {
CarController car = new PoliceCarAdapter();
car.move();
car.phonate();
car.twinkle();
}
}
移动
鸣警笛
闪警灯
4、适配器模式的优缺点
4.1优点
- 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类
- 增加了类的透明性和复用性
- 灵活性和扩展性都非常好,可以在不修改原有代码的基础上增加新的适配器类,完全符合开闭原则
4.2缺点
- 对于Java来说,由于不支持多重继承,所以一次最多只能适配一个适配者类
- 不能为final类
- 类适配器模式中的目标抽象类只能为接口,不能为类,有一定的局限性
- List item
5、适配器模式的适用环境
- 你想使用一个已经存在的类,而它的接口不符合你的需求。
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口 可能不一定兼容的类)协同工作。
- (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行 子类化以匹配它们的接口。对象适配器可以适配它的父类接口。