Python设计模式-代理模式
Python设计模式-代理模式
基于Python3.5.2,代码如下
#coding:utf-8info_struct = dict()
info_struct["addr"] = 10000
info_struct["content"] = ""class Server:content = ""def recv(self,info):passdef send(self,info):passdef show(self):passclass infoServer(Server):def recv(self,info):self.content = inforeturn "recv OK:"def send(self,info):passdef show(self):print("SHOW:%s"%self.content)class serverProxy:passclass infoServerProxy(serverProxy):server = ""def __init__(self,server):self.server = serverdef recv(self,info):return self.server.recv(info)def show(self):self.server.show()class whiteInfoServerProxy(infoServerProxy):white_list = []def recv(self,info):try:assert type(info) == dictexcept:return "info structure is not dict"addr = info.get("addr",0)if not addr in self.white_list:return "Your address is not in whiteList"else:content = info.get("content","")return self.server.recv(content)def addWhite(self,addr):self.white_list.append(addr)def rmvWhite(self,addr):self.white_list.remove(addr)def clearWhite(self):self.white_list = []if __name__ == "__main__":info_struct = dict()info_struct["addr"] = 10010info_struct["content"] = "Hello World"info_server = infoServer()white_server_proxy = whiteInfoServerProxy(info_server)print(white_server_proxy.recv(info_struct))white_server_proxy.show()white_server_proxy.addWhite(10010)print(white_server_proxy.recv(info_struct))white_server_proxy.show()
代理模式分析与解读
代理模式
为某对象提供一个代理,以控制对此对象的访问和控制。代理模式在使用过程中,应尽量对抽象主题类进行代理,而尽量不要对加过修饰和方法的子类代理。
代理模式的适用场景
1、针对某特定对象进行功能和增强性扩展。如IP防火墙、远程访问代理等技术的应用;
2、对主题对象进行保护。如大流量代理,安全代理等;
3、减轻主题对象负载。如权限代理等。
4、为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
5、根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真是对象。
6、用来控制真是对象访问的权限。一般用于对象应该有不同的访问权限的是后。
7、在调用真是对象时,代理处理另外一些事。
解读
在代理模式中,需要隐藏真正提供服务的对象,通过代理对象来间接调用服务对象。
1.先定义好真正提供服务的对象infoServer,并提供recv(),send(),show()三个方法。
2.定义好代理类infoServerProxy,当初始化代理类的时候,将需要提供服务的infoServer对象传入,在实现infoServerProxy的三个方法recv(),send(),show()时,分别调用infoServer对象对应的方法,此时就实现了由代理提供对外接口服务,真正执行由隐藏的服务对象执行。
3.在whiteInfoServerProxy类中,又对代理对象进行了recv方法的封装,当调用whiteInfoServerProxy.recv()方法时,会先对是否调用服务对象的recv()方法进行判断,如果在white_list中能够找到IP则执行服务对象的recv()方法。
程序运行结果如下:
Your address is not in whiteList
SHOW:
recv OK:
SHOW:Hello World
当10010不在白名单里面的时候,返回的是Your address is not in whiteList;当白名单中有10010时,则执行成功recv OK:
代理模式的优缺点:
优点:
1.职责清晰:非常符合单一职责原则,主题对象实现真实业务逻辑,而非本职责的事务,交由代理完成;
2.扩展性强:面对主题对象可能会有的改变,代理模式在不改变对外接口的情况下,可以实现最大程度的扩展;
3.保证主题对象的处理逻辑:代理可以通过检查参数的方式,保证主题对象的处理逻辑输入在理想范围内。
缺点:
1.可能会降低整体业务的处理效率和速度。
备注:
在代理模式的通用写法可归结如下:
class Subject():def request(self):raise NotImplementedErrorclass RealSubject(Subject):def request(self):print("真实请求")class Proxy(Subject):def __init__(self):self.__realSubject = RealSubject()def request(self):self.__realSubject.request()if __name__ == "__main__":# 客户端调用proxy = Proxy()proxy.request()
该实现方式,更具有通用性,更适用于用不同语言对代理模式的实现。
Python设计模式-代理模式相关推荐
- python中代理模式分为几种_通俗 Python 设计模式——代理模式
今天来说一说代理模式. 代理模式顾名思义,是对资源进行代理访问的一种模式,这里的资源是泛指在程序中会使用到的数据.操作.过程.对象等等.当然,针对不同的资源,代理进行的操作不尽相同,根据前人的总结,有 ...
- python 设计模式 代理模式
代理模式:远程代理.虚代理.保护代理 作用: 远程代理:隐藏对象位于远程地址空间的事实, 例如写入数据,而数据库不在本地,需要远程访问.隐藏数据库不在本地的事实,使用代理进行远程存储. 虚代理:为了节 ...
- python中代理模式分为几种_Python设计模式之代理模式实例详解
本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...
- Python设计模式-建造者模式
Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...
- Python设计模式-状态模式
Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- Python设计模式-解释器模式
Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...
- Python设计模式-命令模式
Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...
- Python设计模式-策略模式
Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...
最新文章
- django源码分析 LazySetting对象
- ICA--独立成分分析(Independent Component Analysis)
- 快速恢复Word、Excel的默认初始设置
- matlab-robtics学习笔记
- 未来教育计算机书,未来教育.全国计算机等级考试
- iOS : 静态库(.framework)合并
- mongodb数据库扩展名_MongoDB权威指南
- 收集常用的PHP正则表达式及使用
- .Net学习笔记----2015-06-24(Hashtable 键值对集合)
- Django 3.0实战: 仿链家二手房信息查询网(附GitHub源码)
- 【信源编码】Huffman Coding原理以及MATLAB实现
- 【已解决】双系统启动选择的界面(GRUB)字体太小,Ubuntu登录用户界面字体太小
- echarts设置饼图标示线以及标示文字的颜色等相关样式
- Head first jQuery读书笔记
- 五年级计算机教学要点,五年级信息技术教学工作计划
- 基于OpenCV的手指只数检测
- zabbix 5.0监控客户端
- html flash地址,PHP如何实现将视频html地址转换成flash swf地址
- 如何用TANGO探戈和VVDI编程器来刷写宝马PCF7953钥匙
- Java计算文件的hash值