什么是适配器模式?底层原理是什么?

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于使原本不兼容的接口能够一起工作,或者是用于重新使用已有的类而不需要修改其原始接口。

底层原理

1. 角色和组成

  • 目标接口(Target Interface):客户端期望使用的接口。
  • 适配器(Adapter):实现了目标接口,并且持有一个对适配者对象的引用。适配器通过调用适配者对象的方法来实现目标接口的方法。
  • 适配者(Adaptee):需要被适配的现有类,它的接口与目标接口不兼容。

2. 工作原理

适配器模式通过创建一个适配器类,该适配器类实现了目标接口,并包含一个适配者对象的引用或继承适配者类。当客户端调用适配器的方法时,实际上是调用了适配者对象的方法,从而实现了适配器模式的转换作用。

3. 示例

假设有一个旧的类 OldPrinter,它有一个 printDocument 方法,但是我们希望使用一个新的接口 Printer 来与之交互。这时可以创建一个适配器 PrinterAdapter 来实现 Printer 接口,并在内部调用 OldPrinterprintDocument 方法。

php
// 适配者类 class OldPrinter { public function printDocument() { echo "Printing document from Old Printer...\n"; } } // 目标接口 interface Printer { public function print(); } // 适配器类 class PrinterAdapter implements Printer { private $oldPrinter; public function __construct(OldPrinter $oldPrinter) { $this->oldPrinter = $oldPrinter; } public function print() { $this->oldPrinter->printDocument(); } } // 客户端代码 $oldPrinter = new OldPrinter(); $printerAdapter = new PrinterAdapter($oldPrinter); $printerAdapter->print(); // 调用适配器的方法,实际上会调用旧打印机的方法

4. 优缺点

  • 优点

    • 可以在不修改现有代码的情况下使用已有的类。
    • 可以将不兼容的接口转换成兼容的接口,增加代码的灵活性和可重用性。
  • 缺点

    • 如果适配器过多或过于复杂,可能会导致代码结构混乱,不易理解和维护。
    • 对于一些复杂的适配情况,可能需要多层嵌套适配器,增加了复杂性。

适配器模式在实际应用中常用于整合不同系统或库之间的接口差异,使它们能够协同工作,同时保持系统的灵活性和扩展性。