一,引言
观察者模式(又被称为发布-订阅(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接口并重写里面的方法即可。可以发现所有的接口都接收到了更新的数据。这样观察者模式就已经实现了