代理模式

代理模式

  • 内容

    为其他对象提供一种代理以控制这个兑现的访问

  • 使用场景

    1. 远程代理

      为远程对象提供代理

    2. 虚代理

      根据需要创建很大的对象

      代码实例

      class Subject(metaclass=ABCMeta):
          @abstractmethod
          def get_content(self):
              pass
      
          @abstractmethod
          def set_content(self):
              pass
      
      class RealSubject(Subject):
          def __init__(self, filname):
              self.name = filname
              f = open(filname, encoding='utf-8')
              self.content = f.read()
              f.close()
      
          def get_content(self):
              print(self.content)
      
          def set_content(self, content):
              with open(self.name, 'w', encoding='utf-8') as e:
                  e.write(content)
      
      # ----------------------------------------------------------------------
      # 虚代理
      class VirtualenvProxy(Subject):
          def __init__(self, filname):
              self.filename = filname
              self.sub = None
      
          def set_content(self, content):
              if not self.sub:
                  self.sub = RealSubject(self.filename)
              return self.sub.set_content(content=content)
      
          def get_content(self):
              if not self.sub:
                  self.sub = RealSubject(self.filename)
              return self.sub.get_content()
      
      
    3. 保护代理

      控制对原始对象的访问,用于对象有不同访问权限时

      from abc import ABCMeta, abstractmethod
      
      class Subject(metaclass=ABCMeta):
          @abstractmethod
          def get_content(self):
              pass
      
          @abstractmethod
          def set_content(self):
              pass
      
      # 普通代理
      class RealSubject(Subject):
          def __init__(self, filname):
              self.name = filname
              f = open(filname, encoding='utf-8')
              self.content = f.read()
              f.close()
      
          def get_content(self):
              print(self.content)
      
          def set_content(self, content):
              with open(self.name, 'w', encoding='utf-8') as e:
                  e.write(content)
                  
      # 保护代理
      class ProdectProxy(Subject):
          def __init__(self, filname):
              self.filename = filname
              self.sub = None
      
          def get_content(self):
              if self.sub is None:
                  self.sub = RealSubject(self.filename)
              return self.sub
      
          def set_content(self, content):
              raise PermissionError('没有权限')
      
      prodect = ProdectProxy('1.txt')
      sub = prodect.get_content()
      # sub.get_content()
      prodect.set_content('asdfas')
      
  • 角色

    1. 抽象实体
    2. 实体
    3. 代理
  • 优点

    1. 远程代理

      可以隐藏对象位于远程地址空间的事实

    2. 虚代理

      可以进行优化,例如,根据要求创建对象

    3. 保护代理

      允许在访问一个对象时有一些 附加的业务处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值