模式定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用,Proxy。
模式结构:
- Subject: 抽象主题角色(委托对象和代理对象共同实现的接口)
- Proxy: 代理主题角色
- RealSubject: 真实主题角色
优点:
- 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
- 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
- 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
- 保护代理可以控制对真实对象的使用权限。
缺点:
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
- 实现代理模式需要额外的工作,有些代理模式的实现 非常复杂。
静态代理和动态代理的区别
静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
也就是说,动态代理需要传入被满足特定接口的代理类实例对象。
from abc import ABCMeta, abstractmethodclass Image(metaclass=ABCMeta): @abstractmethod def display(self): passclass RealImage(Image): def __init__(self,filename): self._filename = filename def display(self): print("display:"+self._filename) def loading(self): print("load file ~")class ProxyImage(Image): """静态代理""" 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.loading() self._real_image.display()if __name__ == "__main__": proxy_image = ProxyImage("code.jpg") # 图像加载 proxy_image.display() # 图像不需要加载 proxy_image.display()