基本介绍
观察者模式 (Observer Pattern) 是一种"发布者-订阅者"的模式.有时候也被称为"模型视图模式","源-监听者模式"等. 在这种模式中,由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知.
观察者模式实例类图
观察者模式实例代码
//接口,让WeatherData 来实现
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
/**
* 1.包含最新的天气情况信息
* 2.含有观察者集合,使用ArrayList管理
* 3.当数据有更新时,就主动的调用ArrayList,通知所有的(接入方)就看到最新的信息
*/
public class WeatherData implements Subject {
private float temperatrue; //温度
private float pressure; //气压
private float humidity; //湿度
//观察者集合
private ArrayList<Observer> observers;
public WeatherData() {
observers = new ArrayList<Observer>();
}
public float getTemperatrue() {
return temperatrue;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void dataChange() {
notifyObservers();
}
//当数据有更新时,就调用setData
public void setData(float temperatrue, float pressure, float humidity) {
this.temperatrue = temperatrue;
this.pressure = pressure;
this.humidity = humidity;
//调用dataChange,将最新的信息推送给接入方currentConditions
dataChange();
}
//注册一个观察者
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
//移除一个观察者
@Override
public void removeObserver(Observer o) {
if (observers.contains(o)) {
observers.remove(o);
}
}
//通知:遍历所有的观察者,并通知
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this.temperatrue, this.pressure, this.humidity);
}
}
}
public interface Observer {
public void update(float temperatrue, float pressure, float humidity);
}
public class CurrentConditions implements Observer {
private float temperatrue; //温度
private float pressure; //气压
private float humidity; //湿度
//更新天气情况,是由WeatherData来调用,使用推送模式
public void update(float temperatrue, float pressure, float humidity) {
this.temperatrue = temperatrue;
this.pressure = pressure;
this.humidity = humidity;
display();
}
//显示
public void display() {
System.out.println("***Today mTemperatrue:" + temperatrue + "***");
System.out.println("***Today mPressure:" + pressure + "***");
System.out.println("***Today mHumidity:" + humidity + "***");
}
}
public class Client {
public static void main(String[] args) {
//创建一个WeatherData
WeatherData weatherData = new WeatherData();
//创建观察者
Observer observer = new CurrentConditions();
//注册到weatherData
weatherData.registerObserver(observer);
System.out.println("通知各个注册的观察者,看看信息");
weatherData.setData(10f,100f,30.3f);
}
}
观察者模式在JDK应用的源码分析
追Observable源码可看到,在该类中定义了Vector集合。
Observalbe实现了相关的方法。
Vector集合中嵌套了Observer类型的接口,在接口中定义了update方法。
模式角色分析
- Observable 的作用和地位相当于实例代码中所讲的Subject
- Observable是类,不睡接口,类中已经实现了核心的方法,即管理Observer的方法add,delete,notify…
- Observer的作用和地位相当于实例代码中的Observer,有update
- Observable是类,通过继承实现观察者模式