何为观察者模式
例子引出问题
现在有一颗苹果树,以及两个人,一个是负责种树的人,一个是负责吃苹果的人。
- 如果苹果树病了,种树的人要去治疗树,否则什么也不干;
- 如果树结果了,吃苹果的人要去吃,否则什么也不干;
那么如果苹果树的状态发生变化,种树者和食果者都要去得知树的状态,决定自己是否该行动。但是,两个人都不可能知道什么时候树产生变化,而时时刻刻去查看树的变化显然是不理想的。
解决方法
而观察者模式即使用来解决这个问题的。
系统中,苹果树作为被观察者,人作为观察者,即人会观察苹果树的状态(实际上是苹果树会将自己状态变化告知给人)。
作为被观察者,苹果树要有以下功能:
- 苹果树将要对自己负责的人放入自己观察者列表中,即实现
registerObserver(self,observer)
方法 - 当苹果树状态改变时(苹果树自然知道自身状态什么时候发生改变),会对自己的观察者列表的人发一条消息推送,即实现
notifyObservers(self)
方法 - 当不在需要某个人观察自己时(即状态改变后不用通知Ta),从列表中删除该观察者,即实现
removeObserver(self,observer)
方法
作为观察者,人要有以下功能:
- 当苹果树告知自己树状态改变后,自身应该由此做些什么,实现一个
update()
方法
如此一来,人无需时时刻刻去看树的状态,却不会渎职。
实现
先来实现观察者和被观察者的接口:
#观察者
class Observer:
def update(self,stat):
return
def display(self):
return
#被观察者
class Observed:
def registerObserver(self,observer):
return
def removeObserver(self,observer):
return
def notifyObservers(self):
return
接着,具体实现被观察者植物类:
class plant(Observed):
def __init__(self):
self.observers = []
self.status = 'new'
return
def registerObserver(self,observer):
self.observers.append(observer)
return
def removeObserver(self,observer):
self.observers.remove(observer)
return
def notifyObservers(self):
for item in self.observers:
item.update(self.status)
return
def statusChanged(self):
self.notifyObservers()
def setStatus(self,status):
self.status = status
self.statusChanged()
以及种植者和食用者类:
class planter(Observer):
def __init__(self,plant):
self.plant = plant
self.doing = 'nothing'
plant.registerObserver(self)
return
def update(self,stat):
self.doing = 'work' if stat == 'ill' else 'nothing'
self.display()
return
def display(self):
print('I am planter,my plant now is %s,i doing %s.' % \
(self.plant.status,self.doing))
return
class eater(Observer):
def __init__(self,plant):
self.plant = plant
self.doing = 'nothing'
plant.registerObserver(self)
return
def update(self,stat):
self.doing = 'work' if stat == 'ok' else 'nothing'
self.display()
return
def display(self):
print('I am eater,my plant now is %s,i doing %s.' % \
(self.plant.status,self.doing))
return
完整代码:
# coding=utf-8
#观察者
class Observer:
def update(self,stat):
return
def display(self):
return
#被观察者
class Observed:
def registerObserver(self,observer):
return
def removeObserver(self,observer):
return
def notifyObservers(self):
return
class plant(Observed):
def __init__(self):
self.observers = []
self.status = 'new'
return
def registerObserver(self,observer):
self.observers.append(observer)
return
def removeObserver(self,observer):
self.observers.remove(observer)
return
def notifyObservers(self):
for item in self.observers:
item.update(self.status)
return
def statusChanged(self):
self.notifyObservers()
def setStatus(self,status):
self.status = status
self.statusChanged()
class planter(Observer):
def __init__(self,plant):
self.plant = plant
self.doing = 'nothing'
plant.registerObserver(self)
return
def update(self,stat):
self.doing = 'work' if stat == 'ill' else 'nothing'
self.display()
return
def display(self):
print('I am planter,my plant now is %s,i doing %s.' % \
(self.plant.status,self.doing))
return
class eater(Observer):
def __init__(self,plant):
self.plant = plant
self.doing = 'nothing'
plant.registerObserver(self)
return
def update(self,stat):
self.doing = 'work' if stat == 'ok' else 'nothing'
self.display()
return
def display(self):
print('I am eater,my plant now is %s,i doing %s.' % \
(self.plant.status,self.doing))
return
if __name__ == '__main__':
tree = plant()
display = planter(tree)
tree.setStatus('ill')
display = eater(tree)
tree.setStatus('ok')
tree.setStatus('unknow')
运行结果:
I am planter,my plant now is ill,i doing work.
I am planter,my plant now is ok,i doing nothing.
I am eater,my plant now is ok,i doing work.
I am planter,my plant now is unknow,i doing nothing.
I am eater,my plant now is unknow,i doing nothing.