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中变量的作用域
Jun 16 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python二进制文件的转译详解
Jul 03 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python命令行click参数用法解析
Dec 19 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 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.2时间相差8小时
2007/01/15 PHP
PHP 组件化编程技巧
2009/06/06 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
Python json模块使用实例
2015/04/11 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python画微信表情符的实例代码
2019/10/09 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
python中selenium库的基本使用详解
2020/07/31 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
综合实践教学反思
2014/01/31 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
生日宴会主持词
2014/03/20 职场文书
伦敦奥运会口号
2014/06/13 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle