跳转至

适配器模式

适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它使接口不兼容的对象能够合作工作。适配器模式通过包装一个已有的类,使其接口与目标接口匹配,从而让原本由于接口不兼容而不能一起工作的类可以一起工作。

适配器模式的特点

  1. 接口转换:将一个类的接口转换成客户希望的另一个接口。
  2. 复用现有类:可以使现有的类(不修改其源代码)与其他类协同工作。
  3. 提高类的透明性和复用性:客户端通过接口与适配器进行交互,而不需要关心其内部实现。

适配器模式的结构

  1. 目标接口(Target):定义客户端使用的接口。
  2. 需要适配的类(Adaptee):已有的接口,但不能直接被客户端使用。
  3. 适配器(Adapter):将Adaptee的接口转换为Target接口,使其可以被客户端使用。
  4. 客户端(Client):通过Target接口与适配器交互。

适配器模式的Python实现

以下是适配器模式在Python中的一个实现示例:

1. 定义目标接口和需要适配的类

class Target:
    def request(self) -> str:
        return "Target: The default target's behavior."

class Adaptee:
    def specific_request(self) -> str:
        return ".eetpadA eht fo roivaheb laicepS"

2. 定义适配器类

class Adapter(Target):
    def __init__(self, adaptee: Adaptee) -> None:
        self._adaptee = adaptee

    def request(self) -> str:
        return f"Adapter: (TRANSLATED) {self._adaptee.specific_request()[::-1]}"

3. 客户端代码

def client_code(target: Target) -> None:
    print(target.request())

if __name__ == "__main__":
    print("Client: I can work just fine with the Target objects:")
    target = Target()
    client_code(target)

    print("\nClient: The Adaptee class has a weird interface. See, I don't understand it:")
    adaptee = Adaptee()
    print(f"Adaptee: {adaptee.specific_request()}")

    print("\nClient: But I can work with it via the Adapter:")
    adapter = Adapter(adaptee)
    client_code(adapter)

运行结果

Client: I can work just fine with the Target objects:
Target: The default target's behavior.

Client: The Adaptee class has a weird interface. See, I don't understand it:
Adaptee: .eetpadA eht fo roivaheb laicepS

Client: But I can work with it via the Adapter:
Adapter: (TRANSLATED) Special behavior of the Adaptee.

说明

  1. 目标接口(Target):定义了客户端期望的接口,即request方法。
  2. 需要适配的类(Adaptee):提供了一个不兼容客户端的接口,即specific_request方法。
  3. 适配器(Adapter):将Adaptee的接口转换为Target的接口,实现request方法,并在其中调用Adaptee的specific_request方法,并对其结果进行处理,使其符合Target的接口规范。
  4. 客户端(Client):通过Target接口与适配器交互,而不直接与Adaptee交互。

通过适配器模式,可以在不修改已有代码的情况下,使接口不兼容的类可以协同工作,从而提高代码的复用性和灵活性。适配器模式在需要整合不同库或框架时特别有用。

评论