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中的算数运算符的用法
May 13 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
python进程间通信Queue工作过程详解
Nov 01 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
python中adb有什么功能
Jun 07 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
Django框架请求生命周期实现原理
Nov 13 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php简单分页类实现方法
2015/02/26 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
简易js代码实现计算器操作
2013/04/15 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
python 连接sqlite及简单操作
2017/06/30 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
食品安全演讲稿
2014/09/01 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
Python简易开发之制作计算器
2022/04/28 Python