观察者模式也叫发布-订阅模式,其定义如下:定义对象间一种一对多的依赖关系,使得当该对象状态改变时,所有依赖于它的对象都会得到通知,并被自动更新。
特性
观察者模式的通知方式可以通过直接调用等同步方式实现(如函数调用,HTTP接口调用等),也可以通过消息队列异步调用(同步调用指被观察者发布消息后,必须等所有观察者响应结束后才可以进行接下来的操作;异步调用指被观察者发布消息后,即可进行接下来的操作)。事实上,许多开源的消息队列就直接支持发布-订阅模式,如Zero MQ等。
xx优点
- 观察者与被观察者之间是抽象耦合的;
- 可以将许多符合单一职责原则的模块进行触发,也可以很方便地实现广播。
缺点
- 观察者模式可能会带来整体系统效率的浪费;
- 如果被观察者之间有依赖关系,其逻辑关系的梳理需要费些心思。
应用场景
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()
每天多努力那么一点点,积少成多
网友评论