目录
基本介绍
概述:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
特点:
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则
- 目标与观察者之间建立了一套触发机制
注意:具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。
结构图
具体实现
结构图 |
//接口,让 WeatherData 来实现 public interface Subject { public void registerObserver(Observer o); public void removerObserver(Observer o); public void notifyObservers(); }
//观察者接口,由观察者来实现 public interface Observer { public void update(float temperature, float pressure, float humidity); }
public class CurrentConditions 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 + "***"); } }
/** * 核心类 * 1.包含最新的天气情况信息 * 2.含有观察者集合,使用ArrayList管理 * 3.当数据有更新时,主动调用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 float getPressure() { return pressure; } public float getHumidity() { return humidity; } public void dataChange(){ //调用接入方的update notifyObservers(); } //当数据有更新时,调用setData public void setDate(float temperature, float pressure, float humidity){ this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; //调用dataChange,将最新的信息推送给接入方currentConditions dataChange(); } //注册一个观察者 @Override public void registerObserver(Observer o) { observers.add(o); } //移除一个观察者 @Override public void removerObserver(Observer o) { if (observers.contains(o)){ observers.remove(o); } } //遍历所有的观察者,并通知 @Override public void notifyObservers() { 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.setDate(10f,100f,30.3f); } }
运行结果:
通知各个注册的观察者,看信息
***Today mTemperature: 10.0***
***Today mPressure: 100.0***
***Today mHumidity: 30.3***