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用GET方法上传文件
Mar 10 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
python实现自动重启本程序的方法
Jul 09 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python键盘输入转换为列表的实例
Jun 23 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
Python走楼梯问题解决方法示例
Jul 25 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
Python制作动态字符图的实例
Jan 27 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
python本地文件服务器实例教程
May 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
jquery登录的异步验证操作示例
2019/05/09 jQuery
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
Python深入学习之闭包
2014/08/31 Python
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
python字典操作实例详解
2017/11/16 Python
Python socket实现简单聊天室
2018/04/01 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
英国女士家居服网站:hush
2017/08/09 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
linux面试题参考答案(11)
2016/11/26 面试题
《骑牛比赛》教后反思
2014/04/22 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
老人节主持词
2015/07/04 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
iPhone13再次曝光
2021/04/15 数码科技
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers