Python设计模式之代理模式实例
基于面向过程实现的代理模式
下面是一段体现该设计模式中心的面向过程的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 pands实现execl转csv 并修改csv指定列的方法
今天小编就为大家分享一篇python pands实现execl转csv 并修改csv指定列的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-12-12
聊聊python dropna()和notnull()的用法区别
这篇文章主要介绍了聊聊python dropna()和notnull()的用法区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-03-03


最新评论