当前位置: 首页 > news >正文

Python与设计模式--代理模式

5-Python与设计模式–代理模式

一、网络服务器配置白名单

代理模式是一种使用频率非常高的模式,在多个著名的开源软件和当前多个著名的互联网产品后 
台程序中都有所应用。下面我们用一个抽象化的简单例子,来说明代理模式。

首先,构造一个网络服务器:

#该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容
info_struct=dict()
info_struct["addr"]=10000
info_struct["content"]=""
class Server:content=""def recv(self,info):passdef send(self,info):passdef show(self):pass
class infoServer(Server):def recv(self,info):self.content=inforeturn "recv OK!"def send(self,info):passdef show(self):print "SHOW:%s"%self.content
infoServer有接收和发送的功能,发送功能由于暂时用不到,保留。另外新加一个接口show, 
用来展示服务器接收的内容。接收的数据格式必须如info_struct所示,服务器仅接受info_struct的 
content字段。那么,如何给这个服务器设置一个白名单,使得只有白名单里的地址可以 访问服务器 呢?
修改Server结构是个方法,但这显然不符合软件设计原则中的单一职责原则。 
在此基础之上,使用代理,是个不错的方法。

代理配置如下:

class serverProxy:pass
class 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 correct"addr=info.get("addr",0)if not addr in self.white_list:return "Your address is not in the white list."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=[]

代理中有一个server字段,控制代理的服务器对象,infoServerProxy充当Server的直接接口代理, 而whiteInfoServerProxy直接继承了infoServerProxy对象,同时加入了white_list和对白名单的操作。 这样,在场景中通过对白名单代理的访问,就可以实现服务器的白名单访问了。

if  __name__=="__main__":info_struct = dict()info_struct["addr"] = 10010info_struct["content"] = "Hello World!"info_server = infoServer()info_server_proxy = whiteInfoServerProxy(info_server)print info_server_proxy.recv(info_struct)info_server_proxy.show()info_server_proxy.addWhite(10010)print info_server_proxy.recv(info_struct)info_server_proxy.show()

打印如下:

Your address is not in the white list. SHOW: recv OK! SHOW:Hello
World!

二、代理模式

代理模式定义如下:为某对象提供一个代理,以控制对此对象的访问和控制。代理模式在使用过程中,
应尽量对抽象主题类进行代理,而尽量不要对加过修饰和方法的子类代理。如上例中,
如果有一个xServer继承了Server,并新加了方法xMethod,xServer的代理应以Server为主题进行设计,
而尽量不要以xServer为主题,以xServer为主题的代理可以从ServerProxy继承并添加对应的方法。
JAVA中,讲到代理模式,不得不会提到动态代理。动态代理是实现AOP(面向切面编程)的重要实现手段。
而在Python中,很少会提到动态代理,而AOP则会以另一种模式实现:装饰模式。有关AOP的相关内容,
我们会在装饰模式这一节中进行说明。

三、代理模式的优点和应用场景

3.1 优点:

1、职责清晰:非常符合单一职责原则,主题对象实现真实业务逻辑,而非本职责的事务,交由代理完成;
2、扩展性强:面对主题对象可能会有的改变,代理模式在不改变对外接口的情况下,可以实现最大程度的扩展; 
3、保证主题对象的处理逻辑:代理可以通过检查参数的方式,保证主题对象的处理逻辑输入在理想范围内。

3.2 应用场景:

1、针对某特定对象进行功能和增强性扩展。如IP防火墙、远程访问代理等技术的应用;
2、对主题对象进行保护。如大流量代理,安全代理等;
3、减轻主题对象负载。如权限代理等。

四、代理模式的缺点

1、可能会降低整体业务的处理效率和速度。

相关文章:

  • wangEditor 富文本编辑(粘贴即用)
  • uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解
  • ubuntu编译sqlite3并使用
  • 关于用css设置input输入框hover的时候的样式以及当input为disabled的时候,不要让hover样式生效
  • Python——常见内置模块
  • 【Linux】第二十站:模拟实现shell
  • 《向量数据库指南》——向量数据库Milvus Cloud搭建Excel公式编辑器助手
  • 如何打造“面向体验”的音视频能力——对话火山引擎王悦
  • vivado产生报告阅读分析24-读取和解释时序路径特性报告
  • MyBatis-Plus简介和入门操作
  • 哈希思想的应用
  • JAVA编程规范-集合、并发(阿里手册)
  • RabbitMQ 搭建和工作模式
  • <HarmonyOS第一课>1·运行Hello World【课后考核】
  • C++中声明共用体
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【comparator, comparable】小总结
  • 【刷算法】求1+2+3+...+n
  • Babel配置的不完全指南
  • Flex布局到底解决了什么问题
  • Magento 1.x 中文订单打印乱码
  • npx命令介绍
  • October CMS - 快速入门 9 Images And Galleries
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Cloud中负载均衡器概览
  • windows-nginx-https-本地配置
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 入门级的git使用指北
  • 我有几个粽子,和一个故事
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 移动端解决方案学习记录
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #FPGA(基础知识)
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (175)FPGA门控时钟技术
  • (23)Linux的软硬连接
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (生成器)yield与(迭代器)generator
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net core使用ef 6
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net(C#)中String.Format如何使用
  • .Net中的设计模式——Factory Method模式
  • .net中调用windows performance记录性能信息