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

浙公网安备 33010602011771号