视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python设计模式之代理模式实例
2020-11-27 14:38:32 责编:小采
文档


常用的方式就是使用代理(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()


的类似形式。

下载本文
显示全文
专题