观察者模式应用场景:
消息订阅,变更提醒等。
观察者模式原理:
被观察对象继承 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(推荐该博主)