一、观察者模式
1.什么是观察者模式
观察者又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
二、示例
用户手机客户端在浏览新闻的时候,手机客户端是观察者Observe,而新闻推送端(服务商那边更新发布信息)充当被观察者Observable。
代码示例:
UserClient 类 相当于观察者,它实现java.util.Observer 接口,重写update() 方法。
package com.lixu.javabase.observer;
import java.util.Observable;
import java.util.Observer;
public class UserClient implements Observer {
/**
* 实现接口重新的方法
* 有新消息推送来时,会被调用
*/
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(o instanceof News){//判断是否来自新闻推送端
News news = (News)o;
System.out.println("现在最新消息:" + news.getNews());
}
}
/**
* 打开推送功能
* @param observable 被观察者对象(这里是新闻推送端)
*/
public void openMsg(Observable observable){
//添加到观察者列表
observable.addObserver(this);
}
public void closeMsg(Observable observable){
observable.deleteObserver(this);
}
}
News 类相当于被观察者(Observable ) ,继承java.util.Observable
package com.lixu.javabase.observer;
import java.util.Observable;
/**
* 新闻推送端News代码
*/
public class News extends Observable {
private String news;
public String getNews() {
return news;
}
public void setNews(String news) {
this.news = news;
//发生改变
setChanged();
//推送消息到客户端
notifyObservers();
}
}
测试代码:
package com.lixu.javabase.observer;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
News news = new News();
UserClient uc = new UserClient();
news.setNews("小组赛开始");
uc.openMsg(news);
news.setNews("S9世界总决赛开启");
uc.closeMsg(news);
news.setNews("LPL要赢得比赛");
}
}
结果: