介绍
当一个对象存在多个依赖它的对象时,此对象的改变就会影响众多因素,因此我们希望当此对象改变时,可以自动通知它的依赖对象并自动更新依赖对象中的值。
观察者模式就是为此而生,定义对象间的一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知并被自动更新。属于行为型模式
优点:1、观察者和被观察者是抽象耦合的。 2、需要建立一套触发机制
缺点:
- 观察者过多,通知观察者需要花费大量时间。
- 如果存在某些bug,如观察者与被观察者彼此观察,就会导致无限循环。
- 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
使用场景:
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
- 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
- 一个对象必须通知其他对象,而并不知道这些对象是谁。
- 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意:
- Java中已经有了对观察者模式支持的类
- Observer接口与Observable接口可以分别指代观察者类与被观察者类
- 避免循环引用
- 如果顺序执行,某一观察者错误会导致系统卡壳
实例
通过创建观察者类与被观察类,当被观察类发生改变时,执行通知方法,通知所有观察者这次改变的发生
被观察者类
被观察者类需要继承Observable类,通知方法是notifyObservers
1 | //辅助类,用于此次演示类中的变量属性 |
观察类
观察类需要实现Observer接口,并重写收到通知后的处理方法update
1 | public class Teacher implements Observer { |
测试
1 | public class Test { |
输出结果:
xxx在java设计模式精讲提交了问题
alphaGoGo老师的java设计模式精讲课程接收到一个xxx同学提出的问题,问题内容是:java设计模式的问题
alphaGo老师的java设计模式精讲课程接收到一个xxx同学提出的问题,问题内容是:java设计模式的问题
注意,由于在Observable源码中,使用的是倒序遍历观察者集合,所以后添加进入观察者集合的观察类先收到通知。
1 | for (int i = arrLocal.length-1; i>=0; i--) |
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/25/designPattern/2020-03-25-observerPattern/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!