[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
*
内容:为其他对象提供一种代理一控制对这个对象的访问
*
应用场景:
* 远程代理: 为远程的对象提供代理
* 虚代理:根据需要创建很大的对象
* 保护代理:控制对原始对象的访问,用于对象有不同访问权限时
*
UML图
*
举个例子:
需求:完成一个文件读取和写入,完成远程代理、需代理、保护代理。
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,'r',encoding='utf-8') print(f)
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.subj=None def get_content(self): if not self.subj
: self.subj=RealSubject(self.filename) def set_content(self,content): if not
self.subj: self.subj = RealSubject(self.filename) return self.subj.set_content(
content) # 保护代理 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("无写入权限") # 远程代理 subj=
RealSubject('../test.txt') # 虚拟代理 vir=VirtualProxy('../test.txt') vir.
get_content() vir.set_content("写入文本内容") # 保护代理 protect=ProtectedProxy(
'../test.txt') protect.get_content() protect.set_content("写入文件")
* 优点:
* 远程代理:可以隐藏对象位于远程地址空间的事实
* 虚代理:可以进行优化,例如根据要求创建对象
* 保护代理:允许在访问一个对象时有一些附加的内务处理