代理模式是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理模式通常在不直接访问对象或者访问对象存在某些限制时使用,它可以在客户端和目标对象之间引入一个代理对象,通过代理对象来间接访问目标对象,从而控制对目标对象的访问。
代理模式的结构包括以下几个角色:
- 抽象主题(Subject):定义了目标对象和代理对象的共同接口,客户端通过这个接口访问目标对象。
- 具体主题(Real Subject):实现了抽象主题接口,是真正的目标对象。
- 代理(Proxy):实现了抽象主题接口,并保存了对具体主题对象的引用,它可以控制对具体主题对象的访问,通常在访问具体主题对象之前或之后执行一些额外的操作。
代理模式的常见应用场景包括:
- 远程代理:在客户端和服务器端之间创建代理对象,用于处理远程方法调用和网络通信。
- 虚拟代理:延迟加载目标对象,直到真正需要使用时才创建目标对象,以节省资源。
- 保护代理:控制对目标对象的访问权限,限制客户端对目标对象的操作。
- 缓存代理:在访问目标对象之前检查缓存,如果缓存中存在相应的结果,则直接返回,否则访问目标对象并将结果缓存起来。
下面是一个简单的 Python 实际案例,演示了保护代理的使用场景:
from abc import ABC, abstractmethod
# 抽象主题接口
class Door(ABC):
@abstractmethod
def open(self):
pass
@abstractmethod
def close(self):
pass
# 具体主题类
class LabDoor(Door):
def open(self):
print("实验室的门已打开")
def close(self):
print("实验室的门已关闭")
# 代理类
class SecurityDoor(Door):
def __init__(self, door):
self._door = door
def open(self):
if self.authenticate():
self._door.open()
else:
print("无权限打开门")
def close(self):
self._door.close()
def authenticate(self):
# 模拟身份验证逻辑
password = input("请输入密码以验证身份:")
return password == "password123"
# 客户端代码
if __name__ == "__main__":
lab_door = LabDoor()
security_door = SecurityDoor(lab_door)
# 通过安全门代理对象打开门,需要身份验证
security_door.open()
# 正常关闭门
security_door.close()
在这个案例中,LabDoor 是具体主题类,表示实验室的门;SecurityDoor 是代理类,用于保护实验室门,控制对其打开操作的访问。通过代理类 SecurityDoor,可以在打开门之前执行身份验证操作。
查看原文:代理模式:原来是这样子
关注公众号 "字节航海家" 及时获取最新内容