声明:本系列文章主要参考《精通Python设计模式》一书,并且参考一些资料,结合自己的一些看法来总结而来。

  一、在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访问敏感信息 -- 在允许用户访问敏感信息之前,我们希望确保用户具备足够的去权限。同时在网络访问时,限制某些网络的访问等操作。

  二、把一个计算成本较高的对象的创建过程延迟到用户首次真正使用它的时候才进行。

  以上的情况就可以使用 代理设计模式 。

  代理模式:因使用代理对象再访问实际对象之前执行重要操作而得其名。

  示例:

  之前想用《精通Python设计模式》中的示例来说明,但是发现很负责不太好理解,于是有了接下来的示例:阿里云:Python与设计模式 -代理模式

  一、首先构件一个网络服务器:

#该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容
info_struct=dict()
info_struct["addr"]=10000
info_struct["content"]=""
class Server:
content=""
def recv(self,info):
pass
def send(self,info):
pass
def show(self):
pass
class infoServer(Server):
def recv(self,info):
self.content=info
return "recv OK!"
def send(self,info):
pass
def show(self):
print "SHOW:%s"%self.content

普通的网络服务器

  infoServer有接收和发送的功能,发送功能由于暂时用不到,保留。另外新加一个接口show,用来展示服务器接收的内容。接收的数据格式必须如info_struct所示,服务器仅接受info_struct的content字段。

  二、若此时有需求,该网络服务器只允许部分网络IP进行访问,那么需要设置白名单,该怎么做呢?显然可以有如下两种方式:

  ①、修改Server结构是个方法,即在进入server时,做一系列逻辑判断。但这显然不符合软件设计原则中的单一职责原则。

  ②、使用代理,即利用代理来进行逻辑判定,若在白名单中,则允许访问,若不在则拒绝。

class serverProxy:
pass
class infoServerProxy(serverProxy):
server=""
def __init__(self,server):
self.server=server
def 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)==dict
except:
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和对白名单的操作。这样,在场景中使用一个白名单服务器代理类来实现,在接收请求时,做验证:内容是否符合规则、访问者的IP地址是否在白名单中,若通过则接收内容。

   那么有了白名单服务器代理,该怎么使用呢?

if  __name__=="__main__":
info_struct = dict()
info_struct["addr"] = 10010
info_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!

  这边我也把书中的示例放置在此。

class LazyProperty(object):
'''利用装饰器的特性作为代理,给_resource初始化值'''
def __init__(self, method):
self.method = method
self.method_name = method.__name__
print('func name is:{}'.format(self.method_name)) def __get__(self, obj, cls):
'''使用值来替代方法'''
if not obj:
return None
value = self.method(obj)
print('value {}'.format(value))
setattr(obj, self.method_name, value)
return value class Test(object):
def __init__(self):
self.x = 'foo'
self.y = 'bar'
self._resource = None @LazyProperty # resource = LazyProperty(resource)
def resource(self):
print('init self._resource which is:{}'.format(self._resource))
self._resource = tuple(range(5))
return self._resource def main():
t = Test()
print(t.x)
print(t.y)
print(t._resource)
print(t.resource)
print(t.__dict__)
print(t.resource)
# print(t._resource) if __name__ == '__main__':
main()

精通Python设计模式--示例

 该示例:使用的是装饰器来实现对 resource方法的惰性加载,而该装饰器是使用数据描述符来实现的,故需要对数据描述符有一定的了解。

  over~~,参考:https://yq.aliyun.com/articles/70738?utm_content=m_15329,感谢。。。

浅谈Python设计模式 - 代理模式的更多相关文章

  1. 浅谈Python设计模式 - 外观模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...

  2. 浅谈Python设计模式 - 建造者模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 建造者模式 当我们想要创建一个由多个部分构成的对象,而且他们的构建需要一步接一步 ...

  3. 浅谈Python设计模式 - 工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 工厂模式: 顾名思义,工厂则是根据提供的不同的材料,生产出不同的产品.那么在编程 ...

  4. 浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  5. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  6. 浅谈Python设计模式 - 享元模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 享元模式: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思 ...

  7. 浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  8. Python设计模式——代理模式(Proxy)

    书中的例子是:男A喜欢女A,但是不敢向其表白,所以委托男B为代理,代他送礼物给女A,实现这个需求的重点是,男A和女A是不互相直接接触的,都是通过代理男B,实现间接接触. #encoding=utf-8 ...

  9. 浅谈Python设计模式 - 适配器模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 从本篇便开始介绍结构型设计模式,而适配器设计模式便是该类设计模式的一种,那么什么 ...

随机推荐

  1. Python——IO多路复用之select模块poll方法

    Python——IO多路复用之select模块poll方法 使用poll方法实现IO多路复用 .├── poll_client.py├── poll_server.py└── settings.py ...

  2. Java集合详解6:这次,从头到尾带你解读Java中的红黑树

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  3. libevent笔记5:水位watermarks

    bufferevent中提供了对读写回调的触发条件及最大缓存长度的设置,即低高水位: 低水位:是读写回调函数的最低触发数据长度,当输入/输出缓存区中的数据长度小于低水位时,读/写回调函数不会被触发: ...

  4. Intellij 热部署插件 JRebel [转载]

    原文:https://blog.csdn.net/weixin_42831477/article/details/82229436 Intellij热部署插件JRebel IDEA本身没有集成热部署工 ...

  5. 【06月18日】A股滚动市净率PB历史新低排名

    2010年01月01日 到 2019年06月18日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年06月18日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...

  6. kube-prometheus部署

    一.从git拉取相应yaml文件 git clone https://github.com/coreos/kube-prometheus.git 二.修改grafana及prometheus的serv ...

  7. Postman接口测试【3】_自动添加随笔

    一.抓取博客园编写博客地址 1.通过Charles抓取,获取到编写博客接口地址和接口的参数 二.Postman请求接口 打开Postman,输入上面抓到的接口地址,接口类型为POST,请求参数为x-w ...

  8. 25个led灯新玩法

    Microbit板子的25个led灯,是5X5的阵列,led(lights emitting diodes)中文叫发光二极管,有单向导电性,还发光,有各种颜色的,红,蓝,黄等等.mPython可以让你 ...

  9. 把jar包安装到本地Maven仓库

    使用的场景 自己写的工具类想安装到本地 从Maven仓库中下载不下来的jar 使用的步骤       首先要保证自己的Maven配置全局环境变量,如果没有配置过maven全局变量,可以按照下面的步骤配 ...

  10. C++分治策略实现线性时间选择

    问题描述: 给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,即如果将这n个元素依其线性序排列时,排在第k个的元素即为要找到元素. 细节须知:(与之前的随笔相比) (1 ...