更多信息请参考 【设计模式】
代理模式内容
为其他对象提供一种代理以控制对这个对象的访问
代理模式的角色
- 抽象实体(Subject)
- 实体(RealSubject)
- 代理(Proxy)
代理模式的应用场景
- 远程代理:为远程的对象提供代理
- 虚代理:根据需要创建很大的对象
- 保护代理:控制对原始对象的访问,用于对象有不同访问权限时
代理模式的优点
- 远程代理:可以隐藏对象位于远程地址空间的事实
- 虚代理:可以进行优化,例如根据要求创建对象
- 保护代理:允许在访问一个对象使有一些附加的内务处理
代理模式实例
虚代理实例代码如下
from abc import ABCMeta,abstractmethod
class Subject(metaclass=ABCMeta):
@abstractmethod
def get_content(self):
pass
@abstractmethod
def set_content(self,content):
pass
class RealSubject(Subject):
def __init__(self,filename):
self.filename=filename
f=open(filename)
self.content=f.read()
f.close()
def get_content(self):
return self.content
def set_content(self,content):
f=open(self.filename,'w')
f.write(content)
f.close()
class VirtualProxy(Subject):
def __init__(self,filename):
self.filename=filename
self.subj=None
def get_content(self):
if not self.subj:
self.subj=RealSubject(self.filename)
return self.subj.get_content()
def set_content(self,content):
if not self.subj:
self.subj=RealSubject(self.filename)
return self.subj.set_content(content)
if __name__=="__main__":
subj=VirtualProxy("test.txt")
执行结果为空,这就是虚代理的作用
保护代理实例代码如下:
from abc import ABCMeta,abstractmethod
class Subject(metaclass=ABCMeta):
@abstractmethod
def get_content(self):
pass
@abstractmethod
def set_content(self,content):
pass
class RealSubject(Subject):
def __init__(self,filename):
self.filename=filename
f=open(filename)
self.content=f.read()
f.close()
def get_content(self):
return self.content
def set_content(self,content):
f=open(self.filename,'w')
f.write(content)
f.close()
class ProtectedProxy(Subject):
def __init__(self,filename):
self.subj=RealSubject(filename)
def get_content(self):
return self.subj.get_content()
def set_content(self,content):
raise PermissionError("无写入权限")
if __name__=="__main__":
subj=ProtectedProxy("test.txt")
subj.set_content("hello world")
执行结果如下,这里,还可以通过其他条件进行限制比如作者名或者文本内容或者文本长度等等
Traceback (most recent call last):
File "G:\src\blog_design_patterns\tests\demo.py", line 41, in <module>
subj.set_content("hello world")
File "G:\src\blog_design_patterns\tests\demo.py", line 37, in set_content
raise PermissionError("无写入权限")
PermissionError: 无写入权限