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 ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
深度剖析使用python抓取网页正文的源码
Jun 11 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
基于python爬虫数据处理(详解)
Jun 10 Python
用Pygal绘制直方图代码示例
Dec 07 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
Python反射和内置方法重写操作详解
Aug 27 Python
python list多级排序知识点总结
Oct 23 Python
Django 路由层URLconf的实现
Dec 30 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
Python Pandas解析读写 CSV 文件
Apr 11 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中SQL注入攻击与XSS攻击
2012/06/10 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
JavaScript File分段上传
2016/03/10 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python计算两个数的百分比方法
2018/06/29 Python
对Django中内置的User模型实例详解
2019/08/16 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
应届毕业生的自我鉴定
2013/11/13 职场文书
应届大学生的推荐信
2013/11/20 职场文书
秋季校运动会广播稿
2014/02/23 职场文书
品德评语大全
2014/05/05 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
2015年服务员工作总结
2015/04/08 职场文书
质量整改通知单
2015/04/21 职场文书
接收函
2019/04/22 职场文书
python基础之模块的导入
2021/10/24 Python