您的位置:首页 > 编程语言 > Python开发

Python设计模式-代理模式

2017-06-20 08:46 489 查看

Python设计模式-代理模式

基于Python3.5.2,代码如下

#coding:utf-8

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)

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 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"] = 10010
info_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 NotImplementedError

class 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()


该实现方式,更具有通用性,更适用于用不同语言对代理模式的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: