代理模式包含以下主要角色:
1. 抽象主题(Subject): 定义了代理对象和真实对象的共同接口,客户端通过抽象主题访问真实对象。
2. 真实主题(RealSubject): 定义了实际的业务逻辑,是代理模式中被代理的对象。
3. 代理(Proxy): 实现了抽象主题接口,并持有对真实主题的引用。在代理对象中可以添加一些额外的逻辑,然后调用真实主题的方法。
4. 客户端(Client): 使用代理对象来访问真实对象的客户端代码。
下面是一个简单的代理模式的例子,假设我们有一个图片显示的接口,其中包含了加载和显示图片的方法,我们希望通过代理来控制对图片的访问:
# 抽象主题
class ImageSubject:
def display(self):
pass
# 真实主题
class RealImage(ImageSubject):
def __init__(self, filename):
self._filename = filename
self._load_image()
def _load_image(self):
print(f"Loading image: {self._filename}")
def display(self):
print(f"Displaying image: {self._filename}")
# 代理
class ImageProxy(ImageSubject):
def __init__(self, filename):
self._filename = filename
self._real_image = None
def display(self):
if self._real_image is None:
self._real_image = RealImage(self._filename)
self._real_image.display()
# 客户端代码
if __name__ == "__main__":
# 创建代理对象
image_proxy = ImageProxy("example.jpg")
# 调用代理对象的方法
image_proxy.display()
# 注意:真实对象的加载在第一次调用 display 方法时进行
在上述示例中,ImageSubject 是抽象主题,定义了显示图片的接口。RealImage 是真实主题,实现了具体的加载和显示图片的逻辑。ImageProxy 是代理,持有对真实主题的引用,在调用 display 方法时会延迟加载真实主题,只有在需要显示图片时才会真正加载。
代理模式的优点在于它可以在访问对象时引入一些额外的逻辑,例如延迟加载、权限验证等。这样可以提高系统的灵活性和安全性。代理模式的一种常见应用是虚代理(Virtual Proxy)和保护代理(Protection Proxy)。虚代理用于延迟加载,而保护代理用于控制对对象的访问权限。
转载请注明出处:http://www.zyzy.cn/article/detail/11850/设计模式