观察者模式
意义:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性:
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
- 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
- 一个对象必须通知其他对象,而并不知道这些对象是谁。 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
举例:
class Observer(object):
#观察者核心:销售人员,被观察者number数据
def __init__(self):
self._number = None
self._department = []
@property
def number(self):
return self._number
@number.setter
def number(self, value):
self._number = value
print(f'当前客户数:{self._number}')
for obj in self._department:
obj.change(value)
print('------------------')
def notice(self, department):
#相关部门
self._department.append(department)
class Hr(object):
#人事部门
def change(self, value):
if value < 10:
print("人事变动:裁员")
elif value > 20:
print("人事变动:扩员")
else:
print("人事不受影响")
class Factory(object):
#工厂类
def change(self, value):
if value < 15:
print("生产计划变动:减产")
elif value > 25:
print("生产计划变动:增产")
else:
print("生产计划保持不变")
if __name__ == '__main__':
observer = Observer()
hr = Hr()
factory = Factory()
observer.notice(hr)
observer.notice(factory)
observer.number = 10
observer.number = 15
observer.number = 20
observer.number = 25
输出结果:
当前客户数:10
人事不受影响
生产计划变动:减产
------------------
当前客户数:15
人事不受影响
生产计划保持不变
------------------
当前客户数:20
人事不受影响
生产计划保持不变
------------------
当前客户数:25
人事变动:扩员
生产计划保持不变
------------------