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最基本的操作字典的方法
Apr 24 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
关于python pyqt5安装失败问题的解决方法
Aug 08 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
python实现串口自动触发工作的示例
Jul 02 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 Python
为什么python比较流行
Jun 19 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
Python循环之while无限迭代
Apr 30 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
PHP函数getenv简介和使用实例
2014/05/12 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
php函数式编程简单示例
2019/08/08 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
python处理数据,存进hive表的方法
2018/07/04 Python
pytorch SENet实现案例
2020/06/24 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
Noon埃及:埃及在线购物
2019/11/26 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
父亲生日宴会答谢词
2014/01/10 职场文书
社会实践感言
2014/01/25 职场文书
亮化工程实施方案
2014/03/17 职场文书
超市商业计划书
2014/05/04 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android
最新最全的手机号验证正则表达式
2022/02/24 Javascript