在Java中,观察者模式用于建立对象之间一对多的依赖关系。当某个对象(即被观察者)的状态发生变化时,所有依赖它的对象(即观察者)都会收到通知,并自动进行相应更新。JDK为该模式提供了基础支持,主要由两个组件构成:java.util.Observer接口和java.util.Observable类。前者用于定义观察者的更新行为,后者则代表可被监控的对象,通过两者的协作实现松耦合的对象间通信,适用于事件处理、数据同步等场景。
1、 Observable类供被观察者继承,支持一个或多个观察者的订阅。当调用setChanged方法后,hasChanged方法将返回true,表示对象状态已改变。此时若调用notifyObservers方法,便会触发所有观察者的update方法,通知它们被观察对象已发生变动,从而实现状态的自动通知与同步更新。
2、 Observer接口仅包含一个未实现的抽象方法update,实现了该接口的对象被称为观察者,需自行实现update方法。当某个对象(被观察者)注册了该观察者后,在调用notifyObservers方法时,系统会自动触发所有已注册观察者的update方法,从而实现状态变更的通知与响应,形成观察者与被观察者之间的联动机制。
3、 被观察者I114gBoxHeaterObservable.java用于表示热水器,继承自Observable类,其具体实现方式如下所示。
4、 /**
5、 热水器作为被监控的对象
6、 *
7、 *
8、 */
9、 水温
10、 }
11、 }
12、 加热水至沸腾
13、 从水温15度开始,循环检测温度是否在10到100度之间,持续进行升温处理。
14、 调用setChanged()后,hasChanged()方法会返回true。
15、 当被观察对象的状态发生改变时,其注册的监听者会收到通知并执行相应的更新操作。
16、 }
17、 }
18、 }
19、 该类名为I114gBoxDisplayObservable.java,兼具观察者与被观察者的双重角色,用于表示显示器。它继承自Observable类,并实现了Observer接口,通过这种设计实现状态的监听与更新,具体实现方式如下所示。
20、 /**
21、 显示器作为观察者监视热水器,同时作为被观察者接受报警器的监控。
22、 *
23、 *
24、 */
25、 }
26、 }
27、 显示当前水温
28、 水烧开时
29、 }
30、 记录日志:当前水的状态为+状态+,水温为+温度+度。
31、 }
32、 当被观察对象状态变化时,触发此方法执行。
33、 }
34、 }
35、 观察者I114gBoxAlarmObserver.java 是一个报警器类,实现了Observer接口,用于监听和响应特定事件,具体实现方式如下所示。
36、 /**
37、 报警器即为观察者
38、 *
39、 *
40、 */
41、 水开时调用此方法
42、 }
43、 警报触发
44、 水已烧开,滴滴提示音响起,提醒及时关火。
45、 }
46、 }
47、 Test.java为观察者模式的测试类,具体实现代码如下所示。
48、 /**
49、 观察者模式测试代码示例
50、 *
51、 *
52、 */
53、 添加观察者
54、 显示器用于观察热水器运行状态。
55、 报警器用于监控显示器状态
56、 煮水
57、 }
58、 }
59、 执行测试类,输出结果如下
评论
更多评论