代理模式
为一个对象提供一种代理,控制这个对这个对象的访问
- 远程代理:
- 如vpn,远程办公,不用管服务器在哪里,.只用操作代理即可,代理会把你的操作反馈到对象中
- 虚代理
- 根据需求创建很大的对象,比如浏览器的无图模式,加入图片很大,你不需要看到,浏览器就会不显示图片,等你需要看图点击了以后才读取图片,节约内存
- 保护代理
- 控制对原始对象的访问,设置权限
举例
- 控制对原始对象的访问,设置权限
#抽象实体
class Subject(object):
__metaclass__ = ABCMeta
@abstractmethod
def get_content(self):
pass
@abstractmethod
def set_content(self, content):
pass
#实体
class RealSubject(Subject):
def __init__(self,failename):
self.filename = failename
f = open(failename, 'r')
print "读取文件内容"
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.subject = None
def get_content(self):
if not self.subject:
#需要的时候读取
self.subject = RealSubject(self.filename)
return self.subject.get_content()
def set_content(self, content):
if not self.subject:
self.subject = RealSubject(self.filename)
return self.subject.set_content(content)
#保护代理
class ProtectedProxy(Subject):
def __init__(self, failename):
self.failname = failename
self.subject = RealSubject(failename)
def get_content(self):
return self.subject.get_content()
def set_content(self, content):
print "无权写入数据"
#---------------代理-------------------
#client
#虚代理
# sub = VirtualProxy("test.txt")
# print sub.get_content()
#保护代理
sub = ProtectedProxy("test.txt")
print sub.get_content()
sub.set_content("2222")