适配器模式(Adapter Pattern)是一种结构型设计模式,主要用于将一个类的接口转换成客户端所期望的另一种接口,从而使得原本因接口不兼容而无法一起工作的类能够协同工作。
适配器模式主要解决两类问题:
- 类的接口不兼容问题:客户端期望的接口与现有类的接口不一致,导致无法直接使用。
- 类的复用问题:现有类需要与其他不相关或不可预见的类协同工作,但由于接口不兼容而无法直接组合使用。
适配器模式主要分为两种类型:
- 类适配器模式:通过多重继承将适配器类同时继承自现有类和目标接口,以实现接口转换。在Java等不支持多重继承的语言中,通常通过接口和组合关系来实现类似的效果。
- 对象适配器模式:将现有类的对象作为适配器类的一个属性,通过适配器类来调用现有类的方法,从而实现接口转换。这种方式更符合"组合优于继承"的原则,因此在实践中更为常用。
适配器模式的主要优点包括:
- 提高了系统的灵活性和可扩展性:通过适配器模式,可以使得原本不兼容的类能够协同工作,提高了系统的灵活性。同时,由于适配器模式的实现相对独立,因此可以根据需要添加新的适配器类,从而扩展系统的功能。
- 复用了现有代码:适配器模式充分利用了现有类的方法和数据,无需修改现有类的代码即可实现接口转换,从而降低了开发成本。
- 解耦了客户端和现有类:通过适配器模式,客户端只需与适配器类进行交互,而无需直接调用现有类的方法,从而降低了客户端与现有类之间的耦合度。
适配器模式的一个典型应用场景是笔记本电脑使用三相电流而插座为二相供电的情况。在这种情况下,可以通过使用一个适配器将二相插座转换为笔记本电脑所需的三相接口,从而使得笔记本电脑能够正常充电。在这个例子中,适配器类充当了现有类(二相插座)和目标接口(三相接口)之间的桥梁,实现了接口转换和复用现有代码的目的。
以下是一个简单的Java代码示例,演示了对象适配器模式(Object Adapter Pattern)的实现。
首先,我们定义一个目标接口(Target
),这是客户端所期望的接口:
java
public interface Target {
void request();
}
然后,我们有一个现有的类(Adaptee
),它的接口与Target
不兼容:
java
public class Adaptee {
public void specificRequest() {
System.out.println("Called specificRequest()");
}
}
现在,我们创建一个适配器类(Adapter
),它实现了Target
接口,并且持有一个Adaptee
类型的对象,以便在request
方法中调用Adaptee
的specificRequest
方法:
java
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
最后,我们有一个客户端类(Client
),它使用Target
接口来请求服务:
java
public class Client {
public static void main(String[] args) {
// 创建一个Adaptee对象
Adaptee adaptee = new Adaptee();
// 创建一个Adapter对象,并将Adaptee对象传递给Adapter
Target target = new Adapter(adaptee);
// 使用Target接口请求服务
target.request();
}
}
当你运行Client
类的main
方法时,会输出:
Called specificRequest()
这表明客户端通过适配器成功调用了Adaptee
的specificRequest
方法,尽管Adaptee
的接口与客户端所期望的Target
接口不同。这就是适配器模式的核心思想:将一个类的接口转换成客户端所期望的另一种接口,使得原本不兼容的类能够协同工作。