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 可爱的大小写
Sep 06 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
Django中Model的使用方法教程
Mar 07 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python生成一个迭代器的实操方法
Jun 18 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
python语言是免费还是收费的?
Jun 15 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 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
mysql 字段类型说明
2007/04/27 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
php全角字符转换为半角函数
2014/02/07 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
lib.utf.js
2007/08/21 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
jQuery操作css样式
2017/05/15 jQuery
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
Python json模块使用实例
2015/04/11 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
Python3实现转换Image图片格式
2018/06/21 Python
django缓存配置的几种方法详解
2018/07/16 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
python对XML文件的操作实现代码
2020/03/27 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
法律工作求职自荐信
2013/10/31 职场文书
事业单位辞职信范文
2014/01/19 职场文书
节电标语大全
2014/06/23 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python