设计模式——代理模式(proxy)的python实现

代理模式: 就是指某一个代理对象提供一个代理,并让这个代理对象控制对象的引用,形象的可以说是A想访问的C,会通过代理对象B进行访问,A和C之间不会有直接的交互
适用场景:

  1. 远程代理: 为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在 另一台主机中,远程代理又叫做大使(Ambassador)
  2. 虚拟代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建
  3. Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个 开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
  4. 保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
    缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  5. 防火墙(Firewall)代理:保护目标不让恶意用户接近。
  6. 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
  7. 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。
'''
代理模式:给某一个代理对象提供一个代理,并让这个代理对象控制对象的引用,假设RGB类
'''
from abc import ABCMeta,abstractmethod
class Proxy(object):
    def __init__(self, subject):
        self.__subject = subject
    # 代理其实本质上就是属性的委托
    def __getattr__(self, name):
        return getattr(self.__subject, name)

class RGB:
    def __init__(self, red, green, blue):
        self.__red = red
        self.__green = green
        self.__blue = blue
    def Red(self):
        return self.__red
    def Green(self):
        return self.__green
    def Blue(self):
        return self.__blue

class NoBlueProxy(Proxy):
    #拦截了blue的访问,这样就不会返回被代理的类的Blue属性
    def Blue(self):
        return 0

if __name__ == '__main__':
    rgb = RGB(100, 192, 240)
    print(rgb.Red())
    proxy = Proxy(rgb)
    print(proxy.Green())
    noblue = NoBlueProxy(rgb)
    print(noblue.Green())
    print(noblue.Blue())

猜你喜欢

转载自blog.csdn.net/qq_23864401/article/details/94468864
今日推荐