代码成就万世基积沙镇海,梦想永在凌云意意气风发。

Python设计模式-代理模式

Python设计模式-代理模式

基于Python3.5.2,代码如下

 1 #coding:utf-8
 2 
 3 info_struct = dict()
 4 info_struct["addr"] = 10000
 5 info_struct["content"] = ""
 6 
 7 class Server:
 8     content = ""
 9     def recv(self,info):
10         pass
11     def send(self,info):
12         pass
13     def show(self):
14         pass
15 
16 class infoServer(Server):
17     def recv(self,info):
18         self.content = info
19         return "recv OK:"
20     def send(self,info):
21         pass
22     def show(self):
23         print("SHOW:%s"%self.content)
24 
25 class serverProxy:
26     pass
27 
28 class infoServerProxy(serverProxy):
29     server = ""
30     def __init__(self,server):
31         self.server = server
32     def recv(self,info):
33         return self.server.recv(info)
34     def show(self):
35         self.server.show()
36 
37 class whiteInfoServerProxy(infoServerProxy):
38     white_list = []
39     def recv(self,info):
40         try:
41             assert type(info) == dict
42         except:
43             return "info structure is not dict"
44         addr = info.get("addr",0)
45         if not addr in self.white_list:
46             return "Your address is not in whiteList"
47         else:
48             content = info.get("content","")
49             return self.server.recv(content)
50     def addWhite(self,addr):
51         self.white_list.append(addr)
52     def rmvWhite(self,addr):
53         self.white_list.remove(addr)
54     def clearWhite(self):
55         self.white_list = []
56 
57 if __name__ == "__main__":
58     info_struct = dict()
59     info_struct["addr"] = 10010
60     info_struct["content"] = "Hello World"
61     info_server = infoServer()
62     white_server_proxy = whiteInfoServerProxy(info_server)
63     print(white_server_proxy.recv(info_struct))
64     white_server_proxy.show()
65     white_server_proxy.addWhite(10010)
66     print(white_server_proxy.recv(info_struct))
67     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.可能会降低整体业务的处理效率和速度。

备注:

 1 在代理模式的通用写法可归结如下:
 2 
 3 class Subject():
 4     def request(self):
 5         raise NotImplementedError
 6 
 7 class RealSubject(Subject):
 8     def request(self):
 9         print("真实请求")
10 
11 class Proxy(Subject):
12     def __init__(self):
13         self.__realSubject = RealSubject()
14     def request(self):
15         self.__realSubject.request()
16 
17 if __name__ == "__main__":
18     # 客户端调用
19     proxy = Proxy()
20     proxy.request()
21 
22 
23 该实现方式,更具有通用性,更适用于用不同语言对代理模式的实现。

 

posted @ 2017-10-18 22:44  Tomorrow1  阅读(114)  评论(0)    收藏  举报