代理模式学习笔记
什么是代理模式?
代理模式是一种结构型设计模式,它允许通过创建代理对象来提供额外的间接层,从而控制对原始对象的访问。
代理物件有时被称为surrogate,在本文中将使用这两个术语互换。
在代理模式中,我们定义了一个新对象来封装真正的对象。这个新对象即代理,通过代理,我们能够更好地控制对原始对象的访问,可以在访问原始对象之前或之后执行其他操作。
代理模式包括4个角色,分别是:
- 抽象主题(Subject):定义了代理和真正的对象之间的公共接口,这样就可以在任何使用真正对象的地方使用代理。
- 真正的主题(Real Subject):实现抽象主题的接口,并处理真正的业务逻辑。
- 代理(Proxy):提供了与真正主题相同的接口,同时还负责管理和维护真正主题对象。
- 客户端(Client):使用代理对象而不是真正的对象进行操作。
代理模式实例
我们以网络服务为例来说明代理模式。在网络上请求某些资源时,可能需要等待一段时间才能得到响应。这时,我们可以通过代理来缓存响应,减少等待时间。
pythonCopy Codefrom 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 CodeRealSubject: 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.
。