【程序设计】Python的代理模式
2018-01-27 19:19
288 查看
代理模式是一种使用频率非常高的模式,在多个著名的开源软件和当前多个著名的互联网产品后台程序中都有所应用。
代理模式定义如下:为某对象提供一个代理,以控制对此对象的访问和控制。
代理模式在使用过程中,应尽量对抽象主题类进行代理,而尽量不要对加过修饰和方法的子类代理。
优点:
1、职责清晰:非常符合单一职责原则,主题对象实现真实业务逻辑,而非本职责的事务,交由代理完成;
2、扩展性强:面对主题对象可能会有的改变,代理模式在不改变对外接口的情况下,可以实现最大程度的扩展;
3、保证主题对象的处理逻辑:代理可以通过检查参数的方式,保证主题对象的处理逻辑输入在理想范围内。
应用场景:
1、针对某特定对象进行功能和增强性扩展。如IP防火墙、远程访问代理等技术的应用;
2、对主题对象进行保护。如大流量代理,安全代理等;
3、减轻主题对象负载。如权限代理等。
缺点
1、可能会降低整体业务的处理效率和速度。
流程图:
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 "接收 OK!"
def send(self,info):
pass
def show(self):
print ("显示:%s" % self.content)
# 代理配置
"""
代理中有一个server字段,控制代理的服务器对象,infoServerProxy充当Server的直接接口代理,
而whiteInfoServerProxy直接继承了infoServerProxy对象,同时加入了white_list和对白名单的操作。
"""
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 "信息结构不正确。"
addr=info.get("addr",0)
if not addr in self.white_list:
return "你的地址不在白名单里。"
else:
content=info.get("内容","")
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"] = 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()
原文:https://yq.aliyun.com/articles/70738
代理模式定义如下:为某对象提供一个代理,以控制对此对象的访问和控制。
代理模式在使用过程中,应尽量对抽象主题类进行代理,而尽量不要对加过修饰和方法的子类代理。
优点:
1、职责清晰:非常符合单一职责原则,主题对象实现真实业务逻辑,而非本职责的事务,交由代理完成;
2、扩展性强:面对主题对象可能会有的改变,代理模式在不改变对外接口的情况下,可以实现最大程度的扩展;
3、保证主题对象的处理逻辑:代理可以通过检查参数的方式,保证主题对象的处理逻辑输入在理想范围内。
应用场景:
1、针对某特定对象进行功能和增强性扩展。如IP防火墙、远程访问代理等技术的应用;
2、对主题对象进行保护。如大流量代理,安全代理等;
3、减轻主题对象负载。如权限代理等。
缺点
1、可能会降低整体业务的处理效率和速度。
流程图:
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 "接收 OK!"
def send(self,info):
pass
def show(self):
print ("显示:%s" % self.content)
# 代理配置
"""
代理中有一个server字段,控制代理的服务器对象,infoServerProxy充当Server的直接接口代理,
而whiteInfoServerProxy直接继承了infoServerProxy对象,同时加入了white_list和对白名单的操作。
"""
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 "信息结构不正确。"
addr=info.get("addr",0)
if not addr in self.white_list:
return "你的地址不在白名单里。"
else:
content=info.get("内容","")
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"] = 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()
原文:https://yq.aliyun.com/articles/70738
相关文章推荐
- 【程序设计】Python的建造者模式
- python设计模式-代理模式
- python,使用代理模式访问淘宝,百度,京东,阿里
- 大话设计模式之Python实现【代理模式】
- 代理模式(python)
- 23种设计模式之python实现--代理(Proxy)模式
- 【程序设计】Python的桥梁模式
- python设计模式之代理模式
- Python设计模式之代理模式实例
- 【程序设计】Python的命令模式
- 代理模式(python)
- [Python设计模式]代理模式(Proxy)
- 【程序设计】Python的单例模式
- 【程序设计】Python的原型模式
- 代理模式(python)
- Python实现代理模式
- [Design Pattern]Python设计模式——代理模式
- Python设计模式——代理模式(Proxy)
- 大话设计模式(Python版)--代理模式
- Python设计模式(5)-代理模式