Python设计模式结构型代理模式
一、代理模式
代理模式,为其他对象提供一种代理,以此控制一个对象的访问方式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
二、应用场景
远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador
)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建,例如:图片延迟加载。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
保护代理(Protection Proxy ):控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。
智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
三、代码示例
实体角色:
- 抽象角色(Subject):通过接口或抽象类声明真实角色实现的业务方法。
- 真实角色(Real Subject):实现了抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
- 代理角色(Proxy):实现了抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
import abc # 抽象角色 class Subject(metaclass=abc.ABCMeta): @abc.abstractmethod def get_content(self): pass @abc.abstractmethod def set_content(self, content): pass # 真实角色 class RealSubject(Subject): def __init__(self, filename): self.filename = filename f = open(self.filename, "r", encoding="utf-8") self.content = f.read() print("读取文件...") f.close() def get_content(self): return self.content def set_content(self, content): f = open(self.filename, "w", encoding="utf-8") 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) # 保护代理 class ProtectedProxy(Subject): def __init__(self, filename): self.filename = filename self.subj = RealSubject(self.filename) def get_content(self): return self.subj.get_content() def set_content(self, content): raise PermissionError("您的权限不够!") if __name__ == "__main__": print("--- RealSubject ---") subj = RealSubject("test.txt") # 在这里就会读取文件,并占用内存。 print(subj.get_content()) #subj.set_content("修改内容...") print("--- VirtualProxy ---") subj = VirtualProxy("test.txt") # 虚代理只有在调用 get_content 时才会读取文件,并占用内存。 #print(subj.get_content()) #subj.set_content("修改内容...") print("--- ProtectedProxy ---") subj = ProtectedProxy("test.txt") #print(subj.get_content()) #subj.set_content("修改内容...") # 保护代理这里不能进行修改,会报错。
到此这篇关于Python设计模式结构型代理模式的文章就介绍到这了,更多相关Python代理模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python库Celery异步发送电子邮件定时生成报告实战示例
这篇文章主要介绍了python库Celery异步发送电子邮件定时生成报告实战示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2024-01-01python库TextDistance量化文本之间的相似度算法探究
这篇文章主要为大家介绍了python库TextDistance量化文本之间的相似度算法探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2024-01-01Python操作Excel神器openpyxl使用教程(超详细!)
openpyxl库是一个很好处理xlsx的python库,下面这篇文章主要给大家介绍了关于Python办公自动化openpyxl使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-01-01python开发之IDEL(Python GUI)的使用方法图文详解
这篇文章主要介绍了python开发之IDEL(Python GUI)的使用方法,结合图文形式较为详细的分析总结了Python GUI的具体使用方法,需要的朋友可以参考下2015-11-11获取CSDN文章内容并转换为markdown文本的python
这篇文章主要介绍了自己写的小工具,可以直接获取csdn文章并转换为markdown格式,需要的朋友可以参考下2020-09-09Python解析命令行读取参数--argparse模块使用方法
这篇文章主要介绍了Python解析命令行读取参数--argparse模块使用方法,需要的朋友可以参考下2018-01-01
最新评论