一、需求
二、观察者模式工作原理 + 类图设计
当subject中的数据发生改变时,会通知所有的obervers;
实际上就是subject 维护了一个oberver的list,observer可以动态的加入subject的list,或者是从中移除
三、观察者模式实现上述需求
/**
* @author houChen
* @date 2022/6/19 21:51
* @Description:
*/
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
/**
* @Description:
* 1、包含最新的天气情况信息
* 2、 拥有观察者集合,使用ArrayList 进行管理
* 3、当数据有更新时,就通知所有的接入方最新的消息
*/
public class WeatherData implements Subject {
private float temperatrue;
private float pressure;
private float humidity;
//观察者集合
private ArrayList<Observer> observers;
public WeatherData() {
this.observers = new ArrayList<Observer>();
}
public float getTemperature() {
return temperatrue;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void setData(float temperature, float pressure, float humidity) {
this.temperatrue = temperature;
this.pressure = pressure;
this.humidity = humidity;
this.notifyObservers();
}
//注册一个观察者
@Override
public void registerObserver(Observer o) {
this.observers.add(o);
}
//移除一个观察者
@Override
public void removeObserver(Observer o) {
if (this.observers.contains(o)) {
this.observers.remove(o);
}
}
//遍历所有的观察者,并进行通知
@Override
public void notifyObservers() {
for (int i = 0; i < this.observers.size(); i++) {
this.observers.get(i).update(this.temperatrue, this.pressure, this.humidity);
}
}
}
/**
* @author houChen
* @date 2022/6/19 21:55
* @Description: 观察者接口
*/
public interface Observer {
public void update(float temperature,float pressure,float humidity);
}
/**
* @author houChen
* @date 2022/6/19 21:58
* @Description: 具体观察者
*/
public class CurrentCondition implements Observer {
// 温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
//更新 天气情况,是由 WeatherData 来调用,我使用推送模式
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
//显示
public void display() {
System.out.println("***Today mTemperature: " + temperature + "***");
System.out.println("***Today mPressure: " + pressure + "***");
System.out.println("***Today mHumidity: " + humidity + "***");
}
}
/**
* @author houChen
* @date 2022/6/19 22:14
* @Description:
*/
public class Client {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
//创建一个观察者
CurrentCondition currentCondition = new CurrentCondition();
//注册观察者
weatherData.registerObserver(currentCondition);
weatherData.setData(10, 100, 30.3f);
}
}
四、观察者模式好处
- 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册移除和通知
- 这样,我们在增加观察者时,就不需要修改核心类WeatherData,
JDK源码: Observale 类就运用了观察者模式