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设计模式-代理模式相关推荐

  1. python中代理模式分为几种_通俗 Python 设计模式——代理模式

    今天来说一说代理模式. 代理模式顾名思义,是对资源进行代理访问的一种模式,这里的资源是泛指在程序中会使用到的数据.操作.过程.对象等等.当然,针对不同的资源,代理进行的操作不尽相同,根据前人的总结,有 ...

  2. python 设计模式 代理模式

    代理模式:远程代理.虚代理.保护代理 作用: 远程代理:隐藏对象位于远程地址空间的事实, 例如写入数据,而数据库不在本地,需要远程访问.隐藏数据库不在本地的事实,使用代理进行远程存储. 虚代理:为了节 ...

  3. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  4. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  5. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  6. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  7. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  8. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  9. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

最新文章

  1. django源码分析 LazySetting对象
  2. ICA--独立成分分析(Independent Component Analysis)
  3. 快速恢复Word、Excel的默认初始设置
  4. matlab-robtics学习笔记
  5. 未来教育计算机书,未来教育.全国计算机等级考试
  6. iOS : 静态库(.framework)合并
  7. mongodb数据库扩展名_MongoDB权威指南
  8. 收集常用的PHP正则表达式及使用
  9. .Net学习笔记----2015-06-24(Hashtable 键值对集合)
  10. Django 3.0实战: 仿链家二手房信息查询网(附GitHub源码)
  11. 【信源编码】Huffman Coding原理以及MATLAB实现
  12. 【已解决】双系统启动选择的界面(GRUB)字体太小,Ubuntu登录用户界面字体太小
  13. echarts设置饼图标示线以及标示文字的颜色等相关样式
  14. Head first jQuery读书笔记
  15. 五年级计算机教学要点,五年级信息技术教学工作计划
  16. 基于OpenCV的手指只数检测
  17. zabbix 5.0监控客户端
  18. html flash地址,PHP如何实现将视频html地址转换成flash swf地址
  19. 如何用TANGO探戈和VVDI编程器来刷写宝马PCF7953钥匙
  20. Java计算文件的hash值

热门文章

  1. 使用 Python 和 OpenCV 构建 SET 求解器
  2. 终于有人把计算机视觉讲明白了 。。。
  3. 为什么我们需要开源的系统芯片?
  4. Python实战 | 送亲戚,送长辈,月饼可视化大屏来帮忙!
  5. 代码恒久远,GitHub 永流传
  6. 平头哥玄铁处理器Linux新版本,5大亮点速览
  7. 从零开始构建:使用CNN和TensorFlow进行人脸特征检测
  8. 用Python远程登陆服务器的最佳实践
  9. COCO 2019挑战赛,旷视研究院拿下三项计算机识别冠军 | ICCV 2019
  10. 不止最佳长论文,腾讯AI在ACL上还有这些NLP成果