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中常见的数据类型小结
Aug 29 Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 Python
Python单元测试实例详解
May 25 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
Django 框架模型操作入门教程
Nov 05 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
Python函数参数定义及传递方式解析
Jun 10 Python
Python如何实现机器人聊天
Sep 10 Python
Python 串口通信的实现
Sep 29 Python
python利用faker库批量生成测试数据
Oct 15 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 syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
理解JS事件循环
2016/01/07 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
python刷投票的脚本实现代码
2014/11/08 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
铣床操作工岗位职责
2014/06/13 职场文书
2014年计生标语
2014/06/23 职场文书
匿名信格式范文
2015/05/27 职场文书
SQL Server中搜索特定的对象
2022/05/25 SQL Server