OpenJDK源码--观察者模式工具类

xiaoxiao2021-02-28  28

观察者模式应用场景:

                            消息订阅,变更提醒等。

观察者模式原理:

                被观察对象继承 Observable 类,观察者实现Observer接口。

                当被观察对象发生变化时(自定义变化),会调用Observable.notifyObservers();方法,

                该方法会调用观察者Observer.update();方法,从而实现联动操作。

代码实施注意点:

                (1): 被观察对象继承 Observable 类,观察者实现Observer接口

                 (2):一个被观察对象可以有多个观察者。

                (3):被观察者发生变化时先调用Observable.setChanged()方法设置是否变化状态。

示例代码:

        模拟新闻更新系统

package com.objServer1; import java.util.Date; import java.util.Observable; /** * 设置被监控者对象 * @author Administrator * */ public class newsInfo extends Observable{ String info; String tatil; Date time ; String add ; void setChangeMode(newsInfo msg){ //外层可以自定义变更条件 setChanged();//设置变更状态 newsInfo arg = new newsInfo(); arg.setAdd(msg.getAdd()); arg.setInfo(msg.getInfo());; arg.setTatil(msg.getTatil());; arg.setTime(msg.getTime());; notifyObservers(arg);//通知当前对象监控者信息发生变动 } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public String getTatil() { return tatil; } public void setTatil(String tatil) { this.tatil = tatil; } public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public String getAdd() { return add; } public void setAdd(String add) { this.add = add; } } package com.objServer1; import java.util.Observable; import java.util.Observer; public class newsChage implements Observer{ //notifyObservers方法会调用Observer.update()方法; @Override public void update(Observable o, Object arg) { if(arg instanceof newsInfo){ newsInfo ss = (newsInfo)arg; System.out.println("今天的新闻标题为:"+ss.getTatil()); System.out.println("今天的新闻内容为:"+ss.getInfo()); System.out.println("今天的新闻地址为:"+ss.getAdd()); System.out.println("今天的新闻时间为:"+ss.getTime()); } } } package com.objServer1; import java.util.Date; public class setNewsInfo{ public static void main(String[] args) { newsInfo msg = new newsInfo();//被监控者 newsChage observerER = new newsChage();//监控者 msg.setAdd("大悦城"); msg.setInfo("喜气洋洋过春节!"); msg.setTatil("过年好!"); msg.setTime(new Date()); msg.addObserver(observerER);//将监控者加入被监控者的监控列表 msg.setChangeMode(msg);//修改被监控者信息,触发监控效果 } }

运行结果:

今天的新闻标题为:过年好! 今天的新闻内容为:喜气洋洋过春节! 今天的新闻地址为:大悦城 今天的新闻时间为:Thu May 03 14:23:22 GMT+08:00 2018

以上!

参考文章:https://blog.csdn.net/fansunion/article/details/13089973(推荐该博主)

转载请注明原文地址: https://www.6miu.com/read-2650065.html

最新回复(0)