python中代理模式分为几种_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()

的类似形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值