适配器模式(Adapter Pattern)
适配器模式是一种结构型设计模式,用于将一种接口转换为客户端期望的另一个接口,使得原本因接口不兼容而无法一起工作的类可以协同工作。适配器为中间者,连接着两个互不相容的接口,从而实现接口的适配。
核心思想:在不改变现有代码的情况下,将一个类的接口转换为客户端期望的接口。
主要组成部分
适配器模式包含以下主要角色:
- 目标接口(Target):定义客户端使用的接口;
- 需要适配的类(Adaptee):一个现有的接口或类,其接口与目标接口不兼容;
- 适配器(Adapter) :一个中间层,
连接目标接口和需要适配的类
,实现接口的转换; - 客户端(Client):通过目标接口使用适配器的功能。
一句话概括适配器组成之间的关系:
一般情况下,
适配器
是目标接口
的具体实现类
,实现的具体功能
是通过调用需要适配的类的功能
来完成。
适配器模式的两种实现方式
类适配器(基于继承)
通过继承
需要适配的类,并实现目标接口。(多用于单继承语言,例如Java)
对象适配器(基于组合)
通过组合
一个需要适配的类的实例,并实现目标接口。(推荐使用,灵活性更高)
案例实现
场景为:插头适配器
假设你有一个旧接口为两孔插头
,现在需要适配
为新的电源插头接口(三孔插头
)。
目标接口--适配器--需要适配的类,这三者的关系为客户端要使用适配类
(三孔插头),但是无法直接插入两孔插头的插座,需要先插入适配器
,然后再将适配器插入两孔插头
,所以他们的连接关系为:需要适配的类>>>适配器>>>目标接口。
案例类图
类适配的类图(基于继承)
对象适配的类图(基于组合)
目标接口(Target)
两孔插头
java
public interface TwoPinPlug {
void connect();
}
被适配类(Adaptee)
三孔插头--接口
java
public interface ThreePinPlug {
void connectWithThreePins();
}
三孔插头--具体实现类
java
public class ThreePinPlugImpl implements ThreePinPlug {
public void connectWithThreePins() {
System.out.println("连接三孔插头");
}
}
类适配器(Adapter - 继承)
通过继承来实现的适配器
java
public class PlugAdapter extends ThreePinPlug implements TwoPinPlug {
@Override
public void connect() {
super.connectWithThreePins(); // 转换三孔插头的接口为两孔插头接口
}
}
对象适配器(Adapter - 组合)
通过组合的方式来实现的适配器
java
public class PlugAdapter2 implements TwoPinPlug {
private ThreePinPlug threePinPlug;
public PlugAdapter2(ThreePinPlug threePinPlug) {
this.threePinPlug = threePinPlug;
}
@Override
public void connect() {
threePinPlug.connectWithThreePins(); // 转换三孔插头的接口为两孔插头接口
}
}
客户端代码
java
public class AdapterPatternDemo {
public static void main(String[] args) {
// 使用类适配器
TwoPinPlug adapter1 = new PlugAdapter();
adapter1.connect();
// 使用对象适配器
ThreePinPlug threePinPlug = new ThreePinPlugImpl();
TwoPinPlug adapter2 = new PlugAdapter2(threePinPlug);
adapter2.connect();
}
}
执行结果
连接三孔插头
连接三孔插头
总结
适配器模式通过引入中间层(适配器),将不兼容的接口转换为客户端需要的接口,实现系统的兼容性和灵活性。
适用场景:当现有类的接口与需求接口不兼容时;当需要将多个不同接口的类统一为同一个接口时;当不修改已有代码且需要与新需求兼容时。