代理模式

模式定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用,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()

  

posted @ 2019-02-11 16:06  家迪的家  阅读(133)  评论(0编辑  收藏  举报