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 该实现方式,更具有通用性,更适用于用不同语言对代理模式的实现。
版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
https://www.cnblogs.com/qq_841161825/

浙公网安备 33010602011771号