十九、观察者模式
目的 定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。核心主题Subject/Observable维护观察者列表提供注册、注销和通知方法。观察者Observer实现更新接口。主题状态改变时调用所有注册观察者的更新方法。场景常用于实现事件处理系统如GUI组件的事件监听、股票价格变动通知等当状态改变时自动通知所有订阅者。首先是观察者接口定义更新方法packageobserver;publicinterfaceIWatcher{voidupdate();}与一个具体观察类packageobserver;publicclassUpdateWatcherimplementsIWatcher{Overridepublicvoidupdate(){// 当被观察对象发生变化时此方法会被调用System.out.println(this 观察到目标已经更新了。);}}然后有一个被观察者接口也称主题接口 Subjectpackageobserver;publicinterfaceIWathedSubject{voidadd(IWatcherwatcher);// 添加观察者voidremove(IWatcherwatcher);// 移除观察者voidupdate();// 更新主题状态voidnotifyWatchers();// 通知所有观察者}与具体被观察者类packageobserver;importjava.util.ArrayList;importjava.util.List;publicclassUpdateWatchedSubjectimplementsIWathedSubject{privateListIWatcherlist;// 存储观察者列表publicUpdateWatchedSubject(){this.listnewArrayList();// 初始化观察者列表}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){//自定义观察者模式IWathedSubjectwatchednewUpdateWatchedSubject();//创建主题watched.add(newUpdateWatcher());//创建三个观察者watched.add(newUpdateWatcher());watched.add(newUpdateWatcher());watched.update();//主题状态变化 通知每个观察者System.out.println();}}终端输出目标主题状态已更新... observer.observer.UpdateWatcher4aa298b7 观察到目标已经更新了。 observer.observer.UpdateWatcher7d4991ad 观察到目标已经更新了。 observer.observer.UpdateWatcher28d93b30 观察到目标已经更新了。