项目代码连接:https://github.com/test-patterns/observer
静态关系结构图如下:
一般情况下,厨房内的工作人员会在开始制作和制作完毕时,向外部发出一个信息。
观察者接口:Observer
1 class Observer(): 2 3 def notify(self, arg): 4 raise NotImplementedError
观察者动作:SMSNotification
1 class SMSNotification(Observer): 2 """ 对被观察者发出的通知采取相应动作 """ 3 4 def notify(self, arg): 5 print("SMS notification: " + arg)
观察者容器:Observable
class Observable(): """ Base class for observable events """ def __init__(self): self._observers = [] def subscribe(self, observer): """ 将一个新的观察者加入容器,即队列self._observers """ if observer not in self._observers: self._observers.append(observer) def unsubscribe(self, observer): """ 从容器中删除某一观察者 """ self._observers.remove(observer) def notify(self, arg=None): """ 向容器中的每一个观察者发送通知 """ for observer in self._observers: observer.notify(arg)
被观察者:PizzaOven
1 class PizzaOven(): 2 """ 被观察者 """ 3 4 def __init__(self): 5 self.pizza_started_event = PizzaOven.PizzaStartedEvent() 6 self.pizza_done_event = PizzaOven.PizzaDoneEvent() 7 8 def make_pizza(self): 9 """ 做披萨动作 """ 10 self.pizza_started() 11 time.sleep(random.randint(1, 5)) 12 self.pizza_done() 13 14 def pizza_started(self): 15 """ 当开始做披萨时被调用 """ 16 self.pizza_started_event.notify("The pizza just started cooking") 17 18 def pizza_done(self): 19 """ 当披萨完成时被调用 """ 20 self.pizza_done_event.notify("The pizza is done") 21 22 class PizzaStartedEvent(Observable): 23 """ 观察者事件:开始做披萨 """ 24 def __init__(self): 25 Observable.__init__(self) 26 27 class PizzaDoneEvent(Observable): 28 """ 观察者事件:披萨完成 """ 29 def __init__(self): 30 Observable.__init__(self)
观察者模式在百度百科上的定义为:观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
在以上观察者模式中可以体现出观察者模式的有点如下:
1、在观察者模式中,实现了模块的高内聚、低耦合。
2、在接口固定的情况下,可以很方便地通过对方法进行重写等操作来实现多态,从而可以使不同观察者对被观察者发出的信息采取不同的动作,极大地提高了代码的可维护性和鲁棒性。
3、被观察者与观察者可以实现一对多和多对多的关系,再次体现了模块之间高内聚、低耦合。