十九、观察者模式
- 目的: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 核心:主题(Subject/Observable)维护观察者列表,提供注册、注销和通知方法。观察者(Observer)实现更新接口。主题状态改变时,调用所有注册观察者的更新方法。
- 场景:常用于实现事件处理系统,如GUI组件的事件监听、股票价格变动通知等,当状态改变时自动通知所有订阅者。
首先是观察者接口,定义更新方法
packageobserver;publicinterfaceIWatcher{voidupdate();}与一个具体观察类
packageobserver;publicclassUpdateWatcherimplementsIWatcher{@Overridepublicvoidupdate(){// 当被观察对象发生变化时,此方法会被调用System.out.println(this+" 观察到目标已经更新了。");}}然后有一个被观察者接口(也称主题接口 Subject)
packageobserver;publicinterfaceIWathedSubject{voidadd(IWatcherwatcher);// 添加观察者voidremove(IWatcherwatcher);// 移除观察者voidupdate();// 更新主题状态voidnotifyWatchers();// 通知所有观察者}与具体被观察者类
packageobserver;importjava.util.ArrayList;importjava.util.List;publicclassUpdateWatchedSubjectimplementsIWathedSubject{privateList<IWatcher>list;// 存储观察者列表publicUpdateWatchedSubject(){this.list=newArrayList<>();// 初始化观察者列表}@Overridepublicvoidadd(IWatcherwatcher){// 添加新的观察者this.list.add(watcher);}@Overridepublicvoidremove(IWatcherwatcher){// 移除指定的观察者this.list.remove(watcher);}@Overridepublicvoidupdate(){// 主题状态发生变化时调用System.out.println("目标主题状态已更新...");// 职责分离 状态变更的预处理notifyWatchers();// 纯粹执行观察者通知}@OverridepublicvoidnotifyWatchers(){// 纯粹执行 通知观察者for(IWatcherwatcher:list){// 遍历观察者列表watcher.update();// 调用每个观察者的反应方法}}}最后是函数入口
packageobserver;publicclassMainTest{publicstaticvoidmain(String[]args){//自定义观察者模式IWathedSubjectwatched=newUpdateWatchedSubject();//创建主题watched.add(newUpdateWatcher());//创建三个观察者watched.add(newUpdateWatcher());watched.add(newUpdateWatcher());watched.update();//主题状态变化 通知每个观察者System.out.println();}}终端输出
目标主题状态已更新... observer.observer.UpdateWatcher@4aa298b7 观察到目标已经更新了。 observer.observer.UpdateWatcher@7d4991ad 观察到目标已经更新了。 observer.observer.UpdateWatcher@28d93b30 观察到目标已经更新了。