Python 之观察者模式

2020-02-04  本文已影响0人  极客匠

观察者模式也叫发布-订阅模式,其定义如下:定义对象间一种一对多的依赖关系,使得当该对象状态改变时,所有依赖于它的对象都会得到通知,并被自动更新。

特性

观察者模式的通知方式可以通过直接调用等同步方式实现(如函数调用,HTTP接口调用等),也可以通过消息队列异步调用(同步调用指被观察者发布消息后,必须等所有观察者响应结束后才可以进行接下来的操作;异步调用指被观察者发布消息后,即可进行接下来的操作)。事实上,许多开源的消息队列就直接支持发布-订阅模式,如Zero MQ等。

xx

优点

  1. 观察者与被观察者之间是抽象耦合的;
  2. 可以将许多符合单一职责原则的模块进行触发,也可以很方便地实现广播。

缺点

  1. 观察者模式可能会带来整体系统效率的浪费;
  2. 如果被观察者之间有依赖关系,其逻辑关系的梳理需要费些心思。

应用场景

1. 消息交换场景。如上述说到的消息队列等;
2. 多级触发场景。比如支持中断模式的场景中,一个中断即会引发一连串反应,就可以使用观察者模式。

代码示例

class ObServer:
    def update(self):
        pass


class AlarmSensor(ObServer):

    def update(self):
        self.run()

    def run(self):
        print('alarm ring...')


class WaterSprinker(ObServer):

    def update(self):
        self.run()

    def run(self):
        print("spray Water...")


class EmergencyDialer(ObServer):

    def update(self):
        self.run()

    def run(self):
        print("Dial 119...")


class Observed:
    observers = []
    action = ""

    def addObserver(self, observer):
        self.observers.append(observer)

    def notifyAll(self):
        for obs in self.observers:
            obs.update()


class SmokeSensor(Observed):
    def setAction(self, action):
        self.action = action

    def isFire(self):
        return True


if __name__ == '__main__':
    observed = SmokeSensor()
    observed.addObserver(AlarmSensor())
    observed.addObserver(WaterSprinker())
    observed.addObserver(EmergencyDialer())
    if observed.isFire():
        observed.setAction("On Fire!")
        observed.notifyAll()

每天多努力那么一点点,积少成多

上一篇 下一篇

猜你喜欢

热点阅读