适配器模式
适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,它使接口不兼容的对象能够合作工作。适配器模式通过包装一个已有的类,使其接口与目标接口匹配,从而让原本由于接口不兼容而不能一起工作的类可以一起工作。
适配器模式的特点
- 接口转换:将一个类的接口转换成客户希望的另一个接口。
- 复用现有类:可以使现有的类(不修改其源代码)与其他类协同工作。
- 提高类的透明性和复用性:客户端通过接口与适配器进行交互,而不需要关心其内部实现。
适配器模式的结构
- 目标接口(Target):定义客户端使用的接口。
- 需要适配的类(Adaptee):已有的接口,但不能直接被客户端使用。
- 适配器(Adapter):将Adaptee的接口转换为Target接口,使其可以被客户端使用。
- 客户端(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.
说明
- 目标接口(Target):定义了客户端期望的接口,即
request
方法。 - 需要适配的类(Adaptee):提供了一个不兼容客户端的接口,即
specific_request
方法。 - 适配器(Adapter):将Adaptee的接口转换为Target的接口,实现
request
方法,并在其中调用Adaptee的specific_request
方法,并对其结果进行处理,使其符合Target的接口规范。 - 客户端(Client):通过Target接口与适配器交互,而不直接与Adaptee交互。
通过适配器模式,可以在不修改已有代码的情况下,使接口不兼容的类可以协同工作,从而提高代码的复用性和灵活性。适配器模式在需要整合不同库或框架时特别有用。