观察者模式
2020-12-21 本文已影响0人
今夜秋风和
什么是观察者模式?
定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己;
观察者模式特点以及应该何时来使用它?
当一个对象改变需要同时改变其他对象,而我们不清楚要更新多少对象状态时,可以考虑使用此模式;
另外,该模式的优点在于解除耦合,将通知者与观察者双方都依赖抽象接口,而不是真正具体的实例对象,比如: 通知者a 实例 中添加了观察者 a 实例,通知者b 实例添加了观察者b 实例,这样,在观察者 a 实例 发生变化时,只会修改自己,而不会影响到其他实例对象;
类的结构图如下:

Subject 作为通知者,定义了需要通知的接口,Observer 作为观察者,定义了当通知到来时,需要做的状态更新操作;
将上述的结构用代码的形式来描述:
通知接口定义:

具体通知者实现:

观察者接口定义:

具体观察者实现:

客户端测试:

观察者模式不足:
以上从一个例子介绍了观察者模式的实现方式,可以看到,通知者和观察者需要提前进行绑定,对于两者提前未知的状态下,这个模式就存在了不足之处,也就是说,通知者提前若不知晓具体观察者的情况下,通知怎么才能被响应到,进而触发执行,下一次我们来分析另一种处理方式,事件委托方式;