Nội dung
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.
Để lại một bình luận