"红灯停,绿灯行" 日常中常见的信号系统就是观察者模式的实际映射,这里交通灯是被观察者,也就是subject,各种开车的比如出租车司机,货车,行人都是观察者。在软件世界中也有这样的概念,一个对象的状态变化会改变一个或多个对象的状态。我们称之为观察者模式。
实际代码中遇到的如:
1.vue中数据双向绑定,父子组件消息传递。
2,微信公众号的订阅模式。
关键点:
定义观察者:
# encoding: utf-8
# 观察者
class Driver(object):
def __init__(self):
pass
def update(self):
pass
class Taxi(Driver):
def __init__(self, name):
self.name = name
def update(self, light):
if light == 'red':
print('红灯停,%s要停车' % self.name)
else:
print('绿灯行,%s要启动车子' % self.name)
定义被观察者:
subject:
1.
class Subject(object):
def __init__(self):
self.observer_list = []
def attach(self, observer):
if observer not in self.observer_list:
self.observer_list.append(observer)
def detach(self, observer):
try:
self.observer_list.remove(observer)
except ValueError:
print('no observer value')
def notify(self, message):
for observe in self.observer_list:
observe.update(message)
class TrafficLight(Subject):
def __init__(self):
super().__init__()
self._light = ''
@property
def light(self):
self.light = self._light
@light.setter
def light(self, light):
self._light = light
self.notify(light)
调用:
if __name__ == '__main__':
driver_a = Taxi('小明')
driver_b = Taxi('小红')
driver_c = Taxi('小天')
traffic_light = TrafficLight()
traffic_light.attach(driver_a)
traffic_light.attach(driver_b)
traffic_light.attach(driver_b)
traffic_light.light = 'red'
traffic_light.detach(driver_a)
traffic_light.detach(driver_c)
traffic_light.light = 'green'
红灯停,小明要停车
红灯停,小红要停车
no observer value
绿灯行,小红要启动车子
Process finished with exit code 0