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中操作日期和时间之gmtime()方法的使用
May 22 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
django用户登录和注销的实现方法
Jul 16 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
python实现学员管理系统
Feb 26 Python
Python3 实现串口两进程同时读写
Jun 12 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
python装饰器代替set get方法实例
Dec 19 Python
解决hive中导入text文件遇到的坑
Apr 07 Python
总结Python使用过程中的bug
Jun 18 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动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
对table和ul实现js分页示例分享
2014/02/24 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
应届生程序员求职信
2013/11/05 职场文书
销售人员自我评价
2014/02/01 职场文书
采购经理岗位职责
2014/02/16 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
婚礼新人答谢词
2015/01/04 职场文书