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()
该实现方式,更具有通用性,更适用于用不同语言对代理模式的实现。
相关文章推荐
- Python设计模式之代理模式实例
- 设计模式之python版(四)代理模式
- Python的结构型设计模式之代理模式
- 举例讲解Python设计模式编程的代理模式与抽象工厂模式
- [Python设计模式]代理模式(Proxy)
- python设计模式之代理模式
- 23种设计模式之python实现--代理(Proxy)模式
- python 设计模式之代理模式
- python设计模式(四)--代理模式(上)
- Python设计模式——代理模式
- Python实现设计模式--06.代理模式(Proxy Pattern)
- python设计模式之代理模式
- Python设计模式(5)-代理模式
- python设计模式(四)--代理模式(中)
- 设计模式-代理模式-proxy-python
- Python设计模式——代理模式(Proxy)
- [Design Pattern]Python设计模式——代理模式
- 简介Python设计模式中的代理模式与模板方法模式编程
- 简介Python设计模式中的代理模式与模板方法模式编程
- Python设计模式之代理模式简单示例