观察者模式可以实现松耦合,使得主题和观察者之间的关系更加灵活。它可以方便地添加新的观察者,以及在运行时动态地增加、删除或修改观察者。同时,观察者模式符合开闭原则,使得主题和观察者可以独立变化,而不会相互影响。
下面是一个简单的观察者模式示例,假设有一个天气监测系统,主题是天气数据,观察者是不同的显示设备,它们实时显示天气数据的变化:
// 主题 - 天气数据
interface WeatherData {
void registerObserver(WeatherObserver observer);
void removeObserver(WeatherObserver observer);
void notifyObservers();
}
// 观察者 - 显示设备
interface WeatherObserver {
void update(float temperature, float humidity, float pressure);
}
// 具体主题 - 天气数据
class WeatherStation implements WeatherData {
private List
private float temperature;
private float humidity;
private float pressure;
public WeatherStation() {
this.observers = new ArrayList<>();
}
public void registerObserver(WeatherObserver observer) {
observers.add(observer);
}
public void removeObserver(WeatherObserver observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (WeatherObserver observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObservers();
}
}
// 具体观察者 - 显示设备
class DisplayDevice implements WeatherObserver {
private String name;
public DisplayDevice(String name) {
this.name = name;
}
public void update(float temperature, float humidity, float pressure) {
System.out.println(name + " - Temperature: " + temperature +
" Humidity: " + humidity + " Pressure: " + pressure);
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
DisplayDevice display1 = new DisplayDevice("Display 1");
DisplayDevice display2 = new DisplayDevice("Display 2");
weatherStation.registerObserver(display1);
weatherStation.registerObserver(display2);
weatherStation.setMeasurements(25.5f, 65.2f, 1013.2f);
// Output:
// Display 1 - Temperature: 25.5 Humidity: 65.2 Pressure: 1013.2
// Display 2 - Temperature: 25.5 Humidity: 65.2 Pressure: 1013.2
weatherStation.removeObserver(display2);
weatherStation.setMeasurements(27.8f, 62.8f, 1010.5f);
// Output:
// Display 1 - Temperature: 27.8 Humidity: 62.8 Pressure: 1010.5
}
}
在上面的示例中,我们定义了主题接口 WeatherData 和观察者接口 WeatherObserver,具体主题类 WeatherStation 和具体观察者类 DisplayDevice。通过注册观察者、更新状态和通知观察者的过程,实现了主题和观察者之间的交互。
RUNOOB RUNOOB
429***967@qq.com
2年前 (2023-07-11)