观察者模式学习笔记

什么是观察者模式?

观察者模式是一种常见的设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式被广泛应用于事件驱动系统中。

观察者模式的组成部分

观察者模式包含以下几个关键元素:

  • 观察者:定义更新的接口,具体观察者实现该接口以便接受主题对象的通知。
  • 具体观察者:具体的观察者,实现观察者接口的方法,以便接收主题对象的通知并进行相应的操作。
  • 主题:定义一个接口,用来添加和删除观察者对象,同时定义通知观察者的方法。
  • 具体主题:具体的主题对象,实现主题接口的方法,用来存储观察者对象,并在状态发生改变时通知观察者。

观察者模式的实例

以一个简单的天气预报系统为例,演示观察者模式的实现。

我们先定义天气数据和主题接口:

javaCopy Code
public class WeatherData { private float temperature; private float humidity; private float pressure; public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } public float getHumidity() { return humidity; } public void setHumidity(float humidity) { this.humidity = humidity; } public float getPressure() { return pressure; } public void setPressure(float pressure) { this.pressure = pressure; } } public interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObservers(); }

然后定义具体的天气数据主题:

javaCopy Code
public class WeatherDataSubject implements Subject { private List<Observer> observerList; private WeatherData weatherData; public WeatherDataSubject() { observerList = new ArrayList<>(); weatherData = new WeatherData(); } public void setData(float temp, float humi, float press) { weatherData.setTemperature(temp); weatherData.setHumidity(humi); weatherData.setPressure(press); notifyObservers(); } @Override public void registerObserver(Observer o) { observerList.add(o); } @Override public void removeObserver(Observer o) { observerList.remove(o); } @Override public void notifyObservers() { for (Observer observer : observerList) { observer.update(weatherData); } } }

具体观察者定义如下:

javaCopy Code
public interface Observer { void update(WeatherData data); } public class Phone implements Observer { @Override public void update(WeatherData data) { System.out.println("Phone display: " + data.getTemperature() + "," + data.getHumidity() + "," + data.getPressure()); } } public class TV implements Observer { @Override public void update(WeatherData data) { System.out.println("TV display: " + data.getTemperature() + "," + data.getHumidity() + "," + data.getPressure()); } }

我们可以在客户端代码中使用这些类来演示观察者模式的工作过程:

javaCopy Code
public class Client { public static void main(String[] args) { WeatherDataSubject subject = new WeatherDataSubject(); Phone phone = new Phone(); TV tv = new TV(); subject.registerObserver(phone); subject.registerObserver(tv); subject.setData(20, 60, 1013); subject.removeObserver(phone); subject.setData(22, 65, 1005); } }

输出结果如下:

Copy Code
Phone display: 20.0,60.0,1013.0 TV display: 20.0,60.0,1013.0 TV display: 22.0,65.0,1005.0

从输出结果可以看出,当天气数据发生改变时,所有注册的观察者都会得到通知并更新自己的状态。