一、内容
为其他对象提供一种代理以控制对这个对象的访问。简单的说就是自己不想去干的事情交给代理去干
二、角色
- 抽象实体
- 实体
- 代理
三、适用场景
- 远程代理:为远程的对象提供代理
- 虚代理:根据需求创建很大的对象
- 保护代理:控制对原始对象的访问,用于对象有不同访问权限时,比如只读不能写。
四、优点
- 远程代理:可以隐藏对象位于远程地址空间的事实
- 虚代理:可以进行优化,例如根据要求创建对象
- 保护代理:允许在访问一个对象时有一些附加的内务处理
六、代码示例
1 from abc import abstractmethod,ABCMeta 2 3 class Subject(metaclass=ABCMeta): 4 @abstractmethod 5 def get_content(self): 6 pass 7 8 class RealSubject(Subject): 9 def __init__(self,filename): 10 self.filename = filename 11 print("读取%s文件内容" % filename) 12 f = open(filename) 13 self.content = f.read() 14 f.close() 15 16 def get_content(self): 17 return self.content 18 19 def set_content(self, content): 20 f = open(self.filename, 'w') 21 f.write(content) 22 f.close() 23 24 25 class ProxyA(Subject): 26 def __init__(self, filename): 27 self.subj = RealSubject(filename) 28 29 def get_content(self): 30 return self.subj.get_content() 31 32 class ProxyB(Subject): 33 '''虚代理''' 34 def __init__(self, filename): 35 self.filename = filename 36 self.subj = None 37 38 def get_content(self): 39 if not self.subj: #if True 如果为空的时候,就去读取文本 40 self.subj = RealSubject(self.filename) 41 return self.subj.get_content() 42 43 44 class ProxyC(Subject): 45 '''保护代理''' 46 def __init__(self, filename): 47 self.subj = RealSubject(filename) 48 49 def get_content(self): 50 return self.get_content() 51 52 def set_content(self): 53 raise PermissionError 54 55 # 写一个set_content 56 57 b = ProxyB("abc.txt") 58 print(b.get_content())