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