close up photo of programming of codes

codecungnhau.com

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

Python Design Patterns: Proxy

Proxy là một mẫu thiết kế cấu trúc cung cấp một đối tượng hoạt động thay thế cho một đối tượng dịch vụ thực được client sử dụng. Một proxy nhận các yêu cầu của client, thực hiện một số công việc (kiểm soát truy cập, bộ nhớ đệm, v.v.) và sau đó chuyển yêu cầu đến một đối tượng dịch vụ.

Đối tượng proxy có giao diện giống như một dịch vụ, điều này làm cho nó có thể hoán đổi cho nhau với một đối tượng thực khi được chuyển cho một client.

Cách sử dụng mẫu

Sử dụng: Mặc dù mẫu Proxy không phải là thường xuyên trong hầu hết các ứng dụng Python, nhưng nó vẫn rất hữu ích trong một số trường hợp đặc biệt. Không thể thay thế khi bạn muốn thêm một số hành vi bổ sung vào một đối tượng của một số lớp hiện có mà không thay đổi mã ứng dụng.

Nhận dạng: Proxy ủy quyền tất cả công việc thực tế cho một số đối tượng khác. Cuối cùng, mỗi phương thức proxy phải tham chiếu đến một đối tượng dịch vụ trừ khi proxy là một lớp con của một dịch vụ.

Chương trình mẫu

Program.cs

from abc import ABC, abstractmethod
class Subject(ABC):
    """
    Giao diện Subject  khai báo các hoạt động chung cho cả RealSubject và Proxy.
    Miễn là client làm việc với RealSubject bằng giao diện này, bạn sẽ có thể 
    chuyển nó qua proxy thay vì chủ thể thực.
    """
    @abstractmethod
    def request(self) -> None:
        pass
class RealSubject(Subject):
    """
    RealSubject chứa một số logic cốt lõi. Thông thường, RealSubject có khả năng 
    thực hiện một số công việc hữu ích cũng có thể rất chậm hoặc nhạy cảm - ví dụ: 
    hiệu chỉnh dữ liệu đầu vào. Proxy có thể giải quyết những vấn đề này mà không 
    cần bất kỳ thay đổi nào đối với mã của RealSubject.
    """
    def request(self) -> None:
        print("RealSubject: Handling request.")
class Proxy(Subject):
    """
    Proxy có giao diện giống với RealSubject.
    """
    def __init__(self, real_subject: RealSubject) -> None:
        self._real_subject = real_subject
    def request(self) -> None:
        """
        Các ứng dụng phổ biến nhất của mẫu Proxy là tải chậm, bộ nhớ đệm, kiểm 
        soát truy cập, ghi nhật ký, v.v. Một Proxy có thể thực hiện một trong những 
        điều này và sau đó, tùy thuộc vào kết quả, chuyển việc thực thi đến cùng 
        một phương thức trong một đối tượng RealSubject được liên kết.
        """
        if self.check_access():
            self._real_subject.request()
            self.log_access()
    def check_access(self) -> bool:
        print("Proxy: Checking access prior to firing a real request.")
        return True
    def log_access(self) -> None:
        print("Proxy: Logging the time of request.", end="")
def client_code(subject: Subject) -> None:
    """
    Mã client phải hoạt động với tất cả các đối tượng (cả đối tượng và proxy) 
    thông qua Subject để hỗ trợ cả đối tượng thực và proxy. Tuy nhiên, trong 
    cuộc sống thực, client chủ yếu làm việc trực tiếp với đối tượng thực của 
    nó. Trong trường hợp này, để triển khai mẫu dễ dàng hơn, bạn có thể
    mở rộng proxy của mình từ lớp của chủ thể thực.
    """
    # ...
    subject.request()
    # ...
if __name__ == "__main__":
    print("Client: Executing the client code with a real subject:")
    real_subject = RealSubject()
    client_code(real_subject)
    print("")
    print("Client: Executing the same client code with a proxy:")
    proxy = Proxy(real_subject)
    client_code(proxy)

Kết quả

Client: Executing the client code with a real subject:
RealSubject: Handling request.
Client: Executing the same client code with a proxy:
Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.

Đã đă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 *