【设计模式-适配】
Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性。
核心思想
适配器模式的核心思想是“将一个类的接口转换成客户期望的另一个接口”,使得两个不兼容的接口能够相互合作。适配器模式可以将现有类的接口与客户端所需的接口进行匹配,达到接口兼容的目的。
组成部分
-
Target(目标接口): 这是客户端期望的接口,通常是你希望进行适配的接口。目标接口可以是一个抽象类或接口。
-
Adaptee(适配者): 这是需要适配的已有接口,可能是一个已经存在的类或接口。适配者类具有客户端需要的功能,但接口与目标接口不兼容。
-
Adapter(适配器): 适配器类实现了目标接口,并持有一个适配者对象的引用。它通过将目标接口的方法委托给适配者对象,实现了接口的转换。
UML图
Java代码
以下是一个简单的 Java 示例,展示了如何实现适配器模式。假设我们有一个旧版的 OldPrinter 类,它的接口不符合客户端的要求,而客户端需要一个符合 Printer 接口的类。
// Target
interface Printer {
void print(String text);
}
// Adaptee
class OldPrinter {
public void printDocument(String text) {
System.out.println("Printing document: " + text);
}
}
// Adapter
class PrinterAdapter implements Printer {
private OldPrinter oldPrinter;
public PrinterAdapter(OldPrinter oldPrinter) {
this.oldPrinter = oldPrinter;
}
@Override
public void print(String text) {
oldPrinter.printDocument(text);
}
}
// Client
public class AdapterPatternExample {
public static void main(String[] args) {
OldPrinter oldPrinter = new OldPrinter();
Printer printer = new PrinterAdapter(oldPrinter);
// Client uses Printer interface
printer.print("Hello, Adapter Pattern!");
}
}
解释
-
Target(Printer): 这是客户端所期望的接口,它定义了 print 方法。
-
Adaptee(OldPrinter): 这是现有的接口,它定义了 printDocument 方法,这个方法的接口与 Printer 不兼容。
-
Adapter(PrinterAdapter): 适配器类实现了 Printer 接口,并持有一个 OldPrinter 对象。适配器的 print 方法将调用 OldPrinter 的 printDocument 方法,从而实现了接口的适配。
优点
-
兼容性: 使得原本不兼容的接口可以协同工作,扩展了类的功能。
-
提高复用性: 适配器模式可以将现有的类与新的接口结合,复用现有的类功能而不需要修改它们。
-
简化客户端代码: 客户端代码只需要依赖目标接口,而不需要关心适配者的细节。
缺点
-
增加复杂性: 适配器模式可能会引入额外的适配器类,使得系统的复杂性增加。
-
性能开销: 由于适配器需要做额外的接口转换,可能会有一定的性能开销。
使用场景
-
旧系统与新系统的集成: 当你需要将一个旧系统与一个新系统进行集成,但它们的接口不兼容时,适配器模式可以帮助你实现这一点。
-
第三方库的集成: 在使用第三方库时,库的接口可能与应用的需求不一致,适配器模式可以用来解决接口不匹配的问题。
-
接口转换: 需要将接口从一种形式转换为另一种形式时,比如在不同的模块之间进行通信。
实现方式
-
类适配器: 通过继承方式实现适配器模式。这种方式需要利用多重继承(在 Java 中通过组合实现),适配器类继承了适配者,并实现了目标接口。
-
对象适配器: 通过组合方式实现适配器模式。适配器类持有一个适配者对象的引用,并实现目标接口,适配器类将目标接口的请求委托给适配者对象处理。
总结
适配器模式通过引入适配器,将不兼容的接口转换为客户端所期望的接口,从而实现接口的兼容性。这种模式可以使系统更加灵活,减少系统的耦合,提高复用性。适配器模式特别适用于集成不兼容的接口或者引入已有的类库时。