一,引言
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
二,以天气气象台为例,来讲述什么是观察者模式
以天气气象台为例,subject接口用于对观察者的注册,删除,以及查询所有的观察者。
ObServer接口用于对观察者的具体实现.并在 气象台更新数据后,通知所有的观察者去修改数据
subject接口
package design_model.ObServer;
public interface Subject {
//注册观察者
public void registerObserver(ObServer obServer);
//移除观察者
public void removeObserver(ObServer obServer);
//遍历所有观察者
public void notifyObserver();
}
ObServer接口
package design_model.ObServer;
//观察者接口
public interface ObServer {
public void update(float temperatrue,float pressure,float humidity);
}
接下来写具体实现、
假定一个观察者为当前观察者,因此编写一个 CurrentConditions 类
//当前观察者
public class CurrentConditions implements ObServer {
//温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
//更新天气
@Override
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
private void display() {
System.out.println("温度为:" + temperature);
System.out.println("大气压:" + pressure);
System.out.println("湿度为:" + humidity);
}
}
WeatherData 类,在这个类中,不仅仅实现接口的方法,还包含了当前天气的数据,
package design_model.ObServer;
import java.util.ArrayList;
/**
* 包含最新的天气状况
* 含有观察者集合,使用ArrayList集合管理
* 当数据更新时,就主动调用ArrayList,通知所有的接入方,让他们接收消息
*/
public class WeatherData implements Subject{
//温度,气压,湿度
private float temperature;
private float pressure;
private float humidity;
private ArrayList<ObServer> obServers;
public WeatherData(){
obServers = new ArrayList<>();
}
public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
public void setData(float temperature,float pressure,float humidity){
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
dataChange();
}
private void dataChange() {
notifyObserver();
}
@Override
public void registerObserver(ObServer obServer) {
obServers.add(obServer);
}
@Override
public void removeObserver(ObServer obServer) {
obServers.remove(obServer);
}
//遍历所有的观察者,并通知
@Override
public void notifyObserver() {
for (int i = 0; i < obServers.size(); i++) {
obServers.get(i).update(this.temperature,this.pressure,this.humidity);
}
}
}
这样的话每个观察者就可以获取到最新的消息了
三,验证
编写一个测试类
public class Client {
public static void main(String[] args) {
//创建一个WeatherData
WeatherData weatherData = new WeatherData();
//创建观察者
CurrentConditions currentConditions = new CurrentConditions();
//注册到WeatherData中
weatherData.registerObserver(currentConditions);
//测试
System.out.println("通知各个观察者,看看信息");
weatherData.setData(10f,100f,30.9f);
}
}
查看用户控制台,我们的当前观察者就已经接收到了已经更新的数据
不仅仅是当前观察者,可以添加更多的观察者,即实现ObServer接口并重写里面的方法即可。可以发现所有的接口都接收到了更新的数据。这样观察者模式就已经实现了