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、可能会降低整体业务的处理效率和速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm+vue的企业文档管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的企业文档管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

Talk | 牛津大学博士后研究员边佳旺:SC-DepthV3-动态场景中的自监督单目深度估计

本期为TechBeat人工智能社区第550期线上Talk。 北京时间11月23日(周四)20:00,牛津大学博士后研究员—边佳旺的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “SC-DepthV3:动态场景中的自监督单目深度估计”,介绍…

Vocoder,声码器详解——语音信号处理学习(十)

参考文献: [1] Vocoder (由助教許博竣同學講授)哔哩哔哩bilibili [2] Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. arXiv preprint arXiv:1609.03499, 2016. [3] https://deepmind.com/blog/article/wavenet-generative-mode…

【华为OD机试题】 给出一个区间的集合,请合并所有重叠的区间。

给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] #输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: #输入: [[1,4],[4,5]] #输出: [[1,5]] #解释: 区间 [1,4] 和 [4,5] 可被视…

window.requestAnimationFrame+localStorage+canvas实现跨窗口小球连线效果

文章目录 前言效果代码后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端系列文章 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家…

FPGA----ZCU106使用petalinux 2019.1的第一个app开发

1、petalinux在zcu106上的构建参见前文 FPGA----ZCU106使用petalinux 2019.1(全网最详)-CSDN博客文章浏览阅读31次。本文完成了Vivado 2019.1版本下的基于ZCU106的全部linux系统移植https://blog.csdn.net/qq_37912811/article/details/1345197352、我们…

Vatee万腾科技的未来探险:Vatee数字创新的独特发现

在科技的浩瀚海洋中,Vatee万腾科技如一艘探险船般,勇敢地驶向未知的数字化领域。这次未来的探险,不仅是一场科技创新的冒险,更是对数字化时代的独特发现和深刻探讨。 Vatee万腾科技视科技创新为一座高峰,而他们的未来探…

java类中局部变量和成员变量有啥区别?

java类中局部变量和成员变量有啥区别? 举个例子,我们可以定义一个Person类,其中有两个成员变量name和age,以及一个构造方法和一个show方法。在构造方法中,我们可以使用this关键字来引用成员变量,以区分同名…

基于亚马逊云科技大语言模型等服务打造企业知识库

背景 大语言模型是自然语言处理领域的一项重要技术,能够通过学习大量的文本数据,生成具有语法和意义的自然语言文本。目前大语言模型已经成为了自然语言处理领域的一个热门话题,引起了广泛的关注和研究。 知识库需求在各行各业中普遍存在&a…

《洛谷深入浅出基础篇》P4715淘汰赛——二叉树

上链接:【深基16.例1】淘汰赛 - 洛谷https://www.luogu.com.cn/problem/P4715 上题干: 题目描述 有 2^n(n≤7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值…

力扣刷题,两数之和

1、两数之和 1、问题描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。…

从裸机启动开始运行一个C++程序(十三)

前序文章请看: 从裸机启动开始运行一个C程序(十二) 从裸机启动开始运行一个C程序(十一) 从裸机启动开始运行一个C程序(十) 从裸机启动开始运行一个C程序(九) 从裸机启动开…

uniapp打包的ipa上架到appstore的傻瓜式教程

​ 转载:uniapp打包的ipa上架到appstore的傻瓜式教程 uniapp打包 在HBuilder X编辑器中打开需要打包的项目,然后点击上面菜单栏中 发行 > 原生App-云打包,对以下弹出的弹窗进行内容填写 ​ 填写完成以后,点击打包操作 ​ ​ …

自定义责任链Filter实现

核心接口 Filter package com.xxx.arch.mw.nbp.common.extension;import com.xxx.commons.data.domain.Result;/*** date 2023/08/25*/ public interface Filter {Result invoke(final Invoker invoker, final Invocation invocation); } Invoker package com.xxx.arch.mw.…

修改mysql的密码(每一步都图文解释哦)

当你想要连接本机数据库时,是不是有可能突然忘记了自己的数据库密码? 在此文中,我们来详细解决一下如何去修改自己的数据库密码,并使用Navicat来连接测试 1.停止mysql服务 打开终端,键入命令,将mysql服务先停止掉,…

设置滚动条样式

滚动条样式&#xff1a; 下面是代码&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><title>CSS3自定义滚动条</title><style>header {font-family: Lobster, cursive;text-align: c…

亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(二)

向量数据库选择哪种近似搜索算法&#xff0c;选择合适的集群规模以及集群设置调优对于知识库的读写性能也十分关键&#xff0c;主要需要考虑以下几个方面&#xff1a; 向量数据库算法选择 在 OpenSearch 里&#xff0c;提供了两种 k-NN 的算法&#xff1a;HNSW (Hierarchical…

基于STM32设计的智能防盗单车锁(马蹄锁)设计_升级版

1. 前言 随着共享单车和自行车的普及,人们对自行车的安全和便利性提出了更高的要求。智能防盗马蹄锁是一种基于 STM32 单片机的智能锁,可以通过手机蓝牙实现开锁和关锁控制,同时具备 GPRS 防盗预警功能,提高了自行车的安全性和使用便利性。 通过智能防盗马蹄锁,用户可以…

YOLOv5和改进后模型的result.csv文件对比

import pandas as pd import matplotlib.pyplot as plt# 读取CSV文件 df1 pd.read_csv(rE:\xianyu\yolo.csv) df2 pd.read_csv(rE:\xianyu\final.csv)# 获取列名 columns df1.columns# 循环绘制每一列的对比图 for column in columns:plt.figure(figsize(8, 5))plt.plot(df1…

技术分享 | 在 IDE 插件开发中接入 JCEF 框架

项目背景 当前的开发环境存在多种不同语言的 IDE&#xff0c;如 JetBrains 全家桶、Eclipse、Android Studio 和 VS Code 等等。由于每个 IDE 各有其特定的语言和平台要求&#xff0c;因此开发 IDE 插件时&#xff0c;需要投入大量资源才能尽可能覆盖大部分工具。同时&#xf…