观察者模式在制作披萨项目中的应用

项目代码连接: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、被观察者与观察者可以实现一对多和多对多的关系,再次体现了模块之间高内聚、低耦合。

猜你喜欢

转载自www.cnblogs.com/liulei-ustc/p/9829871.html