介绍
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式。
举个简单的例子,读卡器作为电脑和内存卡的适配器,把内存卡放到读卡器中,再将读卡器插入电脑,电脑就可以读取内存卡的数据。
应用场景
1、系统需要使用现有的类,而此类的接口不符合系统的需要
模式结构
1. 目标(Target):目标是一个接口,该接口是客户想使用的接口。
2. 被适配者(Adaptee):被适配者是一个已经存在的接口或者抽象类,这个接口或者抽象类需要适配。
3. 适配器(Adapter):适配器是一个类,实现了目标接口,并且包含被适配者的引用,即适配器的职责是对被适配者接口与目标接口进行适配。(适配器类中有了被适配者的引用,就可以调用被适配者的方法与重写来的方法进行适配)
代码案例
现在用户已有一个两相的插座,但最近又有了一个三相插座。现有一台洗衣机和一台电视机,洗衣机按着三相插座的标准配有三相插头,而电视机按着两相插座的标准配有两相插头,现在用户想用新的三相插座来使用洗衣机和电视机,即用新的三相插座为洗衣机和电视机接通电流。
那么,三相插座类(ThreeElectricOutlet)就是目标(Target):
public interface ThreeElectricOutlet {
void connectElectricCurrent();
}
接着,被适配者(Adaptee)是两相插座:
public interface TwoElectricOutlet {
void connectElectricCurrent();
}
适配器类,实现了三相插座,并且包含了两相插座的引用变量,可以在重写三相插座的方法中进行调用两相插座的方法:
public class ThreeElectricAdapter implements ThreeElectricOutlet {
// 定义一个二向插座的引用对象
TwoElectricOutlet outlet;
// 构造函数
ThreeElectricAdapter(TwoElectricOutlet outlet) {
this.outlet = outlet;
}
@Override
public void connectElectricCurrent() {
//通过二相插座引用对象调用其具体方法,实现二相插座通电
outlet.connectElectricCurrent();
}
}
电视机(TV)类:
public class TV implements TwoElectricOutlet {
String name;
TV () {
name = "电视机";
}
@Override
public void connectElectricCurrent() {
turnOn();
}
public void turnOn() {
System.out.println(name + "开始播放节目");
}
}
测试:
public class ApplicationTest {
public static void main(String[] args) {
TV tv = new TV();
// 把电视插在适配器上
ThreeElectricAdapter adapter = new ThreeElectricAdapter(tv);
System.out.println("使用三相插座接通电流");
adapter.connectElectricCurrent();
}
}
优点
1. 目标和被适配者是完全解耦关系。
2. 适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。
缺点
1. 目标类中的目标方法得是抽象的才能保证Adapter类重写了方法。