Python设计模式之代理模式实例

 更新时间:2014年04月26日 11:17:59   作者:  
这篇文章主要介绍了设计模式中的代理模式Python实例,需要的朋友可以参考下

翻墙常用的方式就是使用代理(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中__init__.py到底是什么

    一文带你搞懂Python中__init__.py到底是什么

    朋友们,今天我们来聊聊 Python 里一个低调却至关重要的文件——__init__.py,有些人可能听说过它是“包的标志”,也有人觉得它“没啥大用,可以忽略”,今天我们就来彻底搞清楚 __init__.py 到底是干啥的
    2025-04-04
  • python爬虫之requests库的使用详解

    python爬虫之requests库的使用详解

    这篇文章主要为大家介绍了python爬虫之requests库的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 使用python scrapy爬取天气并导出csv文件

    使用python scrapy爬取天气并导出csv文件

    由于工作需要,将爬虫的文件要保存为csv,以前只是保存为json,下面这篇文章主要给大家介绍了关于如何使用python scrapy爬取天气并导出csv文件的相关资料,需要的朋友可以参考下
    2022-08-08
  • python实现给scatter设置颜色渐变条colorbar的方法

    python实现给scatter设置颜色渐变条colorbar的方法

    今天小编就为大家分享一篇python实现给scatter设置颜色渐变条colorbar的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python抓取文件夹的所有文件

    python抓取文件夹的所有文件

    这篇文章主要为大家详细介绍了python抓取文件夹的所有文件,包括子文件夹和子文件夹的文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • pd.drop_duplicates删除重复行的方法实现

    pd.drop_duplicates删除重复行的方法实现

    drop_duplicates 方法实现对数据框 DataFrame 去除特定列的重复行,本文主要介绍了pd.drop_duplicates删除重复行的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Python中有趣在__call__函数

    Python中有趣在__call__函数

    这篇文章主要介绍了Python中有趣在__call__函数,本文直接给出一个使用实例,以此来讲解__call__函数的用法,需要的朋友可以参考下
    2015-06-06
  • ROS系统将python包编译为可执行文件的简单步骤

    ROS系统将python包编译为可执行文件的简单步骤

    本文章讲述ROS系统下如何将python编译为可以执行文件,步骤比较简单,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Python selenium把歌词评论做成词云图

    Python selenium把歌词评论做成词云图

    大家好,本篇文章主要讲的是Python selenium把歌词评论做成词云图,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 六行python代码的爱心曲线详解

    六行python代码的爱心曲线详解

    这篇文章主要介绍了六行python代码的爱心曲线详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论