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