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


Posted in Python onApril 26, 2014

翻墙常用的方式就是使用代理(Proxy),其基本过程如下:

浏览器<-->代理服务器<-->服务器

如果浏览器请求不到服务器,或者服务器无法响应浏览器,我们可以设定将浏览器的请求传递给代理服务器,代理服务器将请求转发给服务器。然后,代理服务器将服务器的响应内容传递给浏览器。当然,代理服务器在得到请求或者响应内容的时候,本身也可以做些处理,例如缓存静态内容以加速,或者说提取请求内容或者响应内容做些正当或者不正当的分析。这种翻墙方式,就是设计模式中代理模式(Proxy Pattern)的一个具体例子。

维基百科对代理模式做了以下解释:

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.

基于面向过程实现的代理模式

下面是一段体现该设计模式中心的面向过程的python代码:

def hello():
    print 'hi, i am hello'
def proxy():
    print 'prepare....'
    hello()
    print 'finish....'
if __name__ == '__main__':
    proxy()

运行结果:
prepare....
hi, i am hello
finish....

有没有想到装饰器?

基于面向对象实现的代理模式

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方法改为:

def __init__(self):
    self.__rs = None

将ProxySubject的request方法改为:
def request(self, *args, **kwargs):
    if self.__rs == None:
        self.__rs = RealSubject(*args, **kwargs)
    self.__beforeRequest()
    self.__rs.request()
    self.__afterRequest()

的类似形式。
Python 相关文章推荐
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python实现完整的事务操作示例
Jun 20 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
Python函数返回不定数量的值方法
Jan 22 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
pip安装python库的方法总结
Aug 02 Python
python3调用windows dos命令的例子
Aug 14 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
python3获取url文件大小示例代码
Sep 18 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
python中的列表推导浅析
Apr 26 #Python
Python中的Numpy入门教程
Apr 26 #Python
Python中的map、reduce和filter浅析
Apr 26 #Python
Python实现的Kmeans++算法实例
Apr 26 #Python
爬山算法简介和Python实现实例
Apr 26 #Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 #Python
python实现的二叉树算法和kmp算法实例
Apr 25 #Python
You might like
理解PHP5中static和const关键字的区别
2007/03/19 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
javascript动态添加删除tabs标签的方法
2015/07/06 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
python 录制系统声音的示例
2020/12/21 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
土木工程毕业生自荐信
2013/09/21 职场文书
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
经典禁毒标语
2014/06/16 职场文书
综合测评个人总结
2015/03/03 职场文书
龙猫观后感
2015/06/09 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python