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网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
python中pycurl库的用法实例
Sep 30 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
python实现获取Ip归属地等信息
Aug 27 Python
python的unittest测试类代码实例
Dec 07 Python
Python程序运行原理图文解析
Feb 10 Python
python 多线程重启方法
Feb 18 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
基于pandas向csv添加新的行和列
May 25 Python
详解python变量与数据类型
Aug 25 Python
pytorch 中nn.Dropout的使用说明
May 20 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 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支持断点续传的源码
2010/05/16 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP实现添加购物车功能
2017/03/06 PHP
php递归函数怎么用才有效
2018/02/24 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Python语言实现将图片转化为html页面
2017/12/06 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
python实现顺序表的简单代码
2018/09/28 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
基于matplotlib xticks用法详解
2020/04/16 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
JAVA代码查错题
2014/10/10 面试题
销售员自我评价怎么写
2013/09/19 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
节能环保演讲稿
2014/08/28 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
python munch库的使用解析
2021/05/25 Python
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS