1 概述
为其他对象提供一种代理以控制对这个对象的访问
租客通过找中介租房子,中介就是房东的一个代理,中介有权利带客户看房子,但是中介不允许做房东给他赋予权限之后的事情,否则就是违法的。
代理模型常用模式有:
远程代理,为远程对象提供代理
保护代理,保护原始对象,用于对象有不同的访问形式
虚代理,对于一个很大的对象提供一个虚代理,比如浏览器的无图模式,开启后看不到图片,当点击后发起网络请求拿到图片
角色
抽象实体
实体
代理
2 代码实现
虚代理 根据需要创建对象
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=None):
self.filename = filename
f = open(self.filename,'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=None):
self.filename = filename
self.subj = None
def get_content(self):
if not self.subj:
self.subj = RealSubject(self.filename)
return self.subj.content
def set_content(self,content):
if not self.subj:
self.subj = RealSubject(self.filename)
self.subj.set_content(content)
"""
OUT:
rs = RealSubject(filename='test.txt') # 读取文件内容
virtual = VirtualProxy(filename='test.txt') # 不会输出“读取文件内容”
print(virtual.get_content())
读取文件内容
hello woshinibaba
"""
保护代理
class ProtectProxy(Subject):
def __init__(self,filname):
self.filename = filname
self.subj = RealSubject(self.filename)
def get_content(self):
return self.subj.get_content()
def set_content(self,content):
raise PermissionError
if __name__ == '__main__':
pro = ProtectProxy(filname='test.txt')
print(pro.get_content())
"""读取文件内容 hello woshinibaba"""
pro.set_content('fdsa') # PermissionError