close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

Python Design Patterns: Adapter

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.

Đã đăng vào

trong

,

bởi

Bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *