观察者模式
也称为发布/订阅模式,实现一对多的依赖关系,一个目标的改变同时会更新观察者,实现让多个观察者监听一个目标。
JDK给我们提供了一套观察者模式:java.util.Observer和java.util.Observable
Observer:
- update(Observable o, Object obj):这个方法当Observable的changed为true时会调用
Observable:
- Vector《Observer》 obs:存放观察者,为什么要用Vector,好处是什么?
- boolean changed: 标识内容是否改变。
- addObserver(Observer):增加观察者,加了synchronized保证线程安全。
- deleteObserver(Observer):删除观察者,加了synchronized保证线程安全。
- notifyObservers(Object obj):通知所有观察者,判断changed是否为true,如果为true,那么遍历obs逐个调用update,然后改变changed为false。其中对changed的操作加了synchronized保证线程安全。
//创建天气预报
public class WeatherSubject extends Observable{
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
this.setChanged();
}
}
//创建观察者
public class WeatherObserver implements Observer{
private String name;
private String content;
public WeatherObserver(String name){
this.name = name;
}
@Override
public void update(Observable o,Object arg){
this.content = ((WeatherSubject)o).getContent();
System.out.println(name+"接收到信息:"+content);
}
}
//测试
public class TestObserver {
public static void main(String[] args){
//创建两个观察者
WeatherObserver nanObserver = new WeatherObserver("小南");
WeatherObserver xiObserver = new WeatherObserver("小西");
//创建目标天气预报
WeatherSubject subject = new WeatherSubject();
//两个观察者订阅天气预报
subject.addObserver(xiObserver);
subject.addObserver(nanObserver);
//天气预报发生改变
subject.setContent("今天天气晴朗,阳光明媚,温度28度。");
subject.notifyObservers(subject);
}
}