适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期待的另一种接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它包含了两个关键角色:目标接口(Target Interface)和适配器(Adapter)。
结构
- 目标接口(Target Interface): 定义客户端期待的接口。
public interface Target {
void request();
}
- 适配者类(Adaptee): 定义了一个已经存在的接口,但它的接口与客户端期望的接口不一致。
public class Adaptee {
public void specificRequest() {
System.out.println("Adaptee's specific request.");
}
}
- 适配器类(Adapter): 实现了目标接口,同时持有适配者类的实例,在目标接口方法中调用适配者类的方法。
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
优点和缺点
优点:
- 解耦合: 适配器模式使得客户端和适配者类解耦合,客户端不需要知道适配者类的具体接口。
- 复用性: 适配器模式可以重用已有的适配者类,而不需要修改其源代码。
- 灵活性: 适配器模式可以在不改变适配者类和目标接口的前提下,灵活地实现接口的匹配。
缺点:
- 过多的适配器类: 如果系统中有大量的适配器类,可能会使得系统变得复杂。
示例
以下是一个适配器模式的示例,将一个现有的Adaptee适配到Target接口:
// 目标接口
public interface Target {
void request();
}
// 适配者类
public class Adaptee {
public void specificRequest() {
System.out.println("Adaptee's specific request.");
}
}
// 适配器类
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
在这个例子中,Adapter 实现了 Target 接口,同时持有一个 Adaptee 的实例。当客户端调用 request 方法时,实际上会调用 Adaptee 的 specificRequest 方法。这样,适配器模式允许客户端使用 Target 接口,同时又能够调用 Adaptee 的方法。