观察者模式学习笔记
什么是观察者模式?
观察者模式是一种常见的设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式被广泛应用于事件驱动系统中。
观察者模式的组成部分
观察者模式包含以下几个关键元素:
- 观察者:定义更新的接口,具体观察者实现该接口以便接受主题对象的通知。
- 具体观察者:具体的观察者,实现观察者接口的方法,以便接收主题对象的通知并进行相应的操作。
- 主题:定义一个接口,用来添加和删除观察者对象,同时定义通知观察者的方法。
- 具体主题:具体的主题对象,实现主题接口的方法,用来存储观察者对象,并在状态发生改变时通知观察者。
观察者模式的实例
以一个简单的天气预报系统为例,演示观察者模式的实现。
我们先定义天气数据和主题接口:
javaCopy Codepublic 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 Codepublic 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 Codepublic 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 Codepublic 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 CodePhone display: 20.0,60.0,1013.0
TV display: 20.0,60.0,1013.0
TV display: 22.0,65.0,1005.0
从输出结果可以看出,当天气数据发生改变时,所有注册的观察者都会得到通知并更新自己的状态。