Nội dung
Adapter là một mẫu thiết kế cấu trúc, cho phép các đối tượng không tương thích cộng tác.
Adapter hoạt động như một trình bao bọc giữa hai đối tượng. Nó bắt các lời gọi cho một đối tượng và chuyển đổi chúng sang định dạng và giao diện có thể nhận ra bởi đối tượng thứ hai.
Cách sử dụng mẫu
Sử dụng: Mẫu Adapter khá phổ biến trong chương trình Python. Nó rất thường được sử dụng trong các hệ thống dựa trên một số mã cũ. Trong những trường hợp như vậy, Adapter làm cho các mã cũ tương tác với các lớp hiện đại.
Nhận dạng: Adapter có thể nhận biết được bởi một phương thức khởi tạo lấy một thể hiện của một kiểu giao diện / trừu tượng khác. Khi adapter nhận được lời gọi đến bất kỳ phương thức nào của nó, nó sẽ dịch các tham số sang định dạng thích hợp và sau đó chuyển hướng lời gọi đến một hoặc một số phương thức của đối tượng được bao bọc.
Chương trình mẫu
main.py
Dựa trên thừa kế
class Target:
"""
Target xác định giao diện cụ thể được client sử dụng.
"""
def request(self) -> str:
return "Target: The default target's behavior."
class Adaptee:
"""
Adaptee chứa một số hành vi hữu ích, nhưng giao diện của nó không tương thích
với client hiện có. Nó cần một số điều chỉnh trước khi client có thể sử dụng nó.
"""
def specific_request(self) -> str:
return ".eetpadA eht fo roivaheb laicepS"
class Adapter(Target, Adaptee):
"""
Adapter làm cho giao diện của Adaptee tương thích với giao diện của Target.
"""
def request(self) -> str:
return f"Adapter: (TRANSLATED) {self.specific_request()[::-1]}"
def client_code(target: "Target") -> None:
"""
Client hỗ trợ tất cả các lớp tuân theo giao diện Target.
"""
print(target.request(), end="")
if __name__ == "__main__":
print("Client: I can work just fine with the Target objects:")
target = Target()
client_code(target)
print("\n")
adaptee = Adaptee()
print("Client: The Adaptee class has a weird interface. "
"See, I don't understand it:")
print(f"Adaptee: {adaptee.specific_request()}", end="\n\n")
print("Client: But I can work with it via the Adapter:")
adapter = Adapter()
client_code(adapter)
Dựa trên đối tượng composition
class Target:
"""
Target xác định giao diện cụ thể được client sử dụng.
"""
def request(self) -> str:
return "Target: The default target's behavior."
class Adaptee:
"""
Adaptee chứa một số hành vi hữu ích, nhưng giao diện của nó không tương thích
với client hiện có. Nó cần một số điều chỉnh trước khi client có thể sử dụng nó.
"""
def specific_request(self) -> str:
return ".eetpadA eht fo roivaheb laicepS"
class Adapter(Target):
"""
Adapter làm cho giao diện của Adaptee tương thích với giao diện của Target.
"""
def __init__(self, adaptee: Adaptee) -> None:
self.adaptee = adaptee
def request(self) -> str:
return f"Adapter: (TRANSLATED) {self.adaptee.specific_request()[::-1]}"
def client_code(target: Target) -> None:
"""
Client hỗ trợ tất cả các lớp tuân theo giao diện Target.
"""
print(target.request(), end="")
if __name__ == "__main__":
print("Client: I can work just fine with the Target objects:")
target = Target()
client_code(target)
print("\n")
adaptee = Adaptee()
print("Client: The Adaptee class has a weird interface. "
"See, I don't understand it:")
print(f"Adaptee: {adaptee.specific_request()}", end="\n\n")
print("Client: But I can work with it via the Adapter:")
adapter = Adapter(adaptee)
client_code(adapter)
Kết quả:
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.
Để lại một bình luận