代理模式
-
内容
为其他对象提供一种代理以控制这个兑现的访问
-
使用场景
-
远程代理
为远程对象提供代理
-
虚代理
根据需要创建很大的对象
代码实例
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()
-
保护代理
控制对原始对象的访问,用于对象有不同访问权限时
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')
-
-
角色
- 抽象实体
- 实体
- 代理
-
优点
-
远程代理
可以隐藏对象位于远程地址空间的事实
-
虚代理
可以进行优化,例如,根据要求创建对象
-
保护代理
允许在访问一个对象时有一些 附加的业务处理
-