python设计模式观察者模式observe
观察者模式是一个软件设计模式,一个主题对象博包涵一系列依赖他的观察者,自动通知观察者的主题对象的改变,通常会调用每个观察者的一个方法。这个设计模式非常适用于分布式事件处理系统。 典型的在观察者模式下:
1.发布者类应该包涵如下方法:
注册能够接收通知的对象 从主对象到注册对象,通知任何变化 未注册对象不能够接收任何通知信息 2.订购者类应该包涵如下:
发布者会调用一个订购者提供的方法,将任何改变告知注册对象。 3.当一个事件会触发了状态的改变,发表者会调用通知方法 总结:订阅者可以在发布对象中注册或者不注册,如此无论什么事件发生,都会触发发布者通过调用通知方法,去通知订购者。这个通知只会在事件发生的时候,去通知已经注册的订购者。
class ObserveBase ( object ) :
'''
观察者基类
'''
def __init__ ( self) :
self. _obverse_list = [ ]
def attach ( self, observe_obj) :
'''
添加要观察者对象
:param observe_obj: 被观察者对象
:return:
'''
if observe_obj not in self. _obverse_list:
self. _obverse_list. append( observe_obj)
print ( "{}已经将{}加入观察者队列..." . format ( self. name, observe_obj) )
def detach ( self, observe_obj) :
'''
删除观察对象
:param observe_obj: 被观察对象
:return:
'''
try :
self. _obverse_list. remove( observe_obj)
print ( "{}已经将{}移除观察者队列..." . format ( self. name, observe_obj) )
except Exception as e:
pass
def notify ( self) :
'''
通知对象
:return:
'''
for obj in self. _obverse_list:
obj. update( self)
class Observe ( ObserveBase) :
'''
观察者类
'''
def __init__ ( self, name) :
super ( ) . __init__( )
self. name = name
self. _msg = ''
@property
def msg ( self) :
'''
消息
:return:
'''
return self. _msg
@msg. setter
def msg ( self, msg) :
self. _msg = msg
self. notify( )
class Communists ( object ) :
'''
共军被观察者
'''
def __init__ ( self) :
pass
def update ( self, observe_obj) :
print ( "共军:收到[{}]消息[{}]" . format ( observe_obj. name, observe_obj. msg) )
class Military ( ) :
'''
国军被观察者
'''
def __init__ ( self) :
pass
def update ( self, observe_obj) :
print ( "国军:收到[{}]小心[{}]" . format ( observe_obj. name, observe_obj. msg) )
if __name__ == '__main__' :
observeC = Observe( "共军放哨者" )
observeM = Observe( "国军放哨者" )
Carmy = Communists( )
Marmy = Military( )
observeC. attach( Carmy)
observeC. attach( Marmy)
observeM. attach( Marmy)
observeC. msg = "\033[32;1m敌人来了...\033[0m"
observeM. msg = "\033[31;1m发现敌人,请紧急撤离,不要告诉共军\033[0m"
共军放哨者已经将< __main__. Communists object at 0x000002A5ED1A55F8 > 加入观察者队列. . .
共军放哨者已经将< __main__. Military object at 0x000002A5ED1A5978 > 加入观察者队列. . .
国军放哨者已经将< __main__. Military object at 0x000002A5ED1A5978 > 加入观察者队列. . .
共军:收到[ 共军放哨者] 消息[ 敌人来了. . . ]
国军:收到[ 共军放哨者] 小心[ 敌人来了. . . ]
国军:收到[ 国军放哨者] 小心[ 发现敌人,请紧急撤离,不要告诉共军]