源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Python设计模式之代理模式实例

  • 时间:2022-09-30 22:18 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Python设计模式之代理模式实例
翻墙常用的方式就是使用代理(Proxy),其基本过程如下: 浏览器<-->代理服务器<-->服务器 如果浏览器请求不到服务器,或者服务器无法响应浏览器,我们可以设定将浏览器的请求传递给代理服务器,代理服务器将请求转发给服务器。然后,代理服务器将服务器的响应内容传递给浏览器。当然,代理服务器在得到请求或者响应内容的时候,本身也可以做些处理,例如缓存静态内容以加速,或者说提取请求内容或者响应内容做些正当或者不正当的分析。这种翻墙方式,就是设计模式中代理模式(Proxy Pattern)的一个具体例子。 维基百科对代理模式做了以下解释:
[u]复制代码[/u] 代码如下:
In computer programming, the proxy pattern is a software design pattern. A proxy, in its most general form, is a class functioning as an interface to something else. The proxy could interface to anything: a network connection, a large object in memory, a file, or some other resource that is expensive or impossible to duplicate.
[b]基于面向过程实现的代理模式[/b] 下面是一段体现该设计模式中心的面向过程的python代码:
[u]复制代码[/u] 代码如下:
def hello():     print 'hi, i am hello' def proxy():     print 'prepare....'     hello()     print 'finish....' if __name__ == '__main__':     proxy()
运行结果:
[u]复制代码[/u] 代码如下:
prepare.... hi, i am hello finish....
有没有想到装饰器? [b]基于面向对象实现的代理模式[/b]
[u]复制代码[/u] 代码如下:
class AbstractSubject(object):     def __init__(self):         pass     def request(self):         pass class RealSubject(AbstractSubject):     def __init__(self):         pass     def request(self):         print 'hi, i am RealSubject' class ProxySubject(AbstractSubject):     def __init__(self):         self.__rs = RealSubject()     def request(self):         self.__beforeRequest()         self.__rs.request()         self.__afterRequest()     def __beforeRequest(self):         print 'prepare....'     def __afterRequest(self):         print 'finish....' if __name__ == '__main__':     subject = ProxySubject()     subject.request()
如果RealSubject的初始化函数init有参数,代理类ProxySubject可以作两种方式的修改: 第一种: ProxySubject的init方法同样也有参数,初始化代理类的时候将初始化参数传递给RealSubject。 第二种: 将ProxySubject的init方法改为:
[u]复制代码[/u] 代码如下:
def __init__(self):     self.__rs = None
将ProxySubject的request方法改为:
[u]复制代码[/u] 代码如下:
def request(self, *args, **kwargs):     if self.__rs == None:         self.__rs = RealSubject(*args, **kwargs)     self.__beforeRequest()     self.__rs.request()     self.__afterRequest()
的类似形式。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部