代理模式
代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,它提供了一个代理对象来控制对其他对象的访问。代理对象通常充当客户端和目标对象之间的中介,可以用于实现延迟加载、访问控制、缓存数据等功能。
代理模式的特点
- 控制对对象的访问:通过代理对象控制对目标对象的访问。
- 代理对象与目标对象接口一致:代理对象实现与目标对象相同的接口,客户端无需知道具体的目标对象。
- 增强目标对象的功能:代理对象可以在调用目标对象前后执行额外的操作,从而增强目标对象的功能。
代理模式的结构
- 抽象主题(Subject):定义了真实主题和代理主题的共同接口。
- 真实主题(Real Subject):定义了真实对象的具体实现。
- 代理(Proxy):保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。
代理模式的Python实现
以下是代理模式在Python中的一个简单实现示例:
1. 定义抽象主题和真实主题类
from abc import ABC, abstractmethod
# 抽象主题接口
class Subject(ABC):
@abstractmethod
def request(self) -> None:
pass
# 真实主题类
class RealSubject(Subject):
def request(self) -> None:
print("RealSubject: Handling request.")
2. 定义代理类
# 代理类
class Proxy(Subject):
def __init__(self, real_subject: RealSubject) -> None:
self._real_subject = real_subject
def request(self) -> None:
# 可以在调用真实主题之前或之后执行额外的操作
print("Proxy: Logging the request before calling RealSubject.")
self._real_subject.request()
print("Proxy: Logging the request after calling RealSubject.")
3. 客户端代码
def client_code(subject: Subject) -> None:
subject.request()
if __name__ == "__main__":
real_subject = RealSubject()
proxy = Proxy(real_subject)
print("Client: Executing the client code with a real subject:")
client_code(real_subject)
print("\n")
print("Client: Executing the same client code with a proxy:")
client_code(proxy)
运行结果
Client: Executing the client code with a real subject:
RealSubject: Handling request.
Client: Executing the same client code with a proxy:
Proxy: Logging the request before calling RealSubject.
RealSubject: Handling request.
Proxy: Logging the request after calling RealSubject.
说明
- 抽象主题(Subject):定义了真实主题和代理主题的共同接口,即
request
方法。 - 真实主题(RealSubject):实现了抽象主题接口,定义了真实对象的具体行为。
- 代理(Proxy):保存了一个引用以便能够访问实体,并提供一个与抽象主题接口相同的接口,可以在调用真实主题前后执行额外的操作。
通过代理模式,可以在不改变客户端代码的情况下控制对对象的访问,实现了懒加载、权限控制、日志记录等功能。代理模式在需要控制对对象访问或者需要增强对象功能时非常有用,例如远程代理、虚拟代理、保护代理等场景。