代理模式学习笔记

什么是代理模式?

代理模式是一种结构型设计模式,它允许通过创建代理对象来提供额外的间接层,从而控制对原始对象的访问。

代理物件有时被称为surrogate,在本文中将使用这两个术语互换。

在代理模式中,我们定义了一个新对象来封装真正的对象。这个新对象即代理,通过代理,我们能够更好地控制对原始对象的访问,可以在访问原始对象之前或之后执行其他操作。

代理模式包括4个角色,分别是:

  • 抽象主题(Subject):定义了代理和真正的对象之间的公共接口,这样就可以在任何使用真正对象的地方使用代理。
  • 真正的主题(Real Subject):实现抽象主题的接口,并处理真正的业务逻辑。
  • 代理(Proxy):提供了与真正主题相同的接口,同时还负责管理和维护真正主题对象。
  • 客户端(Client):使用代理对象而不是真正的对象进行操作。

代理模式实例

我们以网络服务为例来说明代理模式。在网络上请求某些资源时,可能需要等待一段时间才能得到响应。这时,我们可以通过代理来缓存响应,减少等待时间。

pythonCopy Code
from abc import ABC, abstractmethod class Subject(ABC): @abstractmethod def request(self): pass class RealSubject(Subject): def request(self): print("RealSubject: Handling request.") class Proxy(Subject): def __init__(self, real_subject: RealSubject) -> None: self._real_subject = real_subject def request(self): 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.") def client_code(subject: Subject) -> None: subject.request() if __name__ == "__main__": real_subject = RealSubject() client_code(real_subject) print("\n") proxy = Proxy(real_subject) client_code(proxy)

输出结果为:

Copy Code
RealSubject: Handling request. Proxy: Checking access prior to firing a real request. RealSubject: Handling request. Proxy: Logging the time of request.

在这个例子中,Subject是一个抽象类,定义了代理和真正的对象之间的公共接口。RealSubject实现了Subject,并处理真正的业务逻辑。Proxy提供了与RealSubject相同的接口,同时还负责管理和维护真正主题对象。client_code使用代理对象而不是真正的对象进行操作。

当我们调用client_code(real_subject)时,会直接调用RealSubject类的request方法,输出RealSubject: Handling request.。而当我们调用client_code(proxy)时,会先调用代理类的check_access进行权限验证,然后再调用RealSubject类的request方法,最后再调用代理类的log_access方法进行日志记录。输出结果为Proxy: Checking access prior to firing a real request. RealSubject: Handling request. Proxy: Logging the time of request.