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 相关文章推荐
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
Python3 修改默认环境的方法
Feb 16 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python numpy存取文件的方式
Apr 01 Python
如何通过python实现人脸识别验证
Jan 17 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
python合并多个excel文件的示例
Sep 23 Python
linux中nohup和后台运行进程查看及终止
Jun 24 Python
Python Matplotlib库实现画局部图
Nov 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
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
vue实现简单图片上传
2020/06/30 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
python 限制函数调用次数的实例讲解
2018/04/21 Python
python3个性签名设计实现代码
2018/06/19 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
如何用python批量调整视频声音
2020/12/22 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
数学专业推荐信范文
2013/11/21 职场文书
表决心的诗句大全
2014/03/11 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
化妆品活动策划方案
2014/05/23 职场文书
班级标语大全
2014/06/21 职场文书
平面设计专业求职信
2014/08/09 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
vue实现在data里引入相对路径
2022/06/05 Vue.js