观察者模式的实现方式应用案例
时间: 2024-05-01 19:21:11 浏览: 13
观察者模式是一种常用的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并更新自己的状态。
以下是一个观察者模式的应用案例:
假设有一个气象站,它可以测量温度、湿度和气压,并将这些数据显示在不同的观测站上。当气象站的测量数据发生变化时,所有的观测站都需要更新自己的显示数据。
在这个案例中,气象站是主题对象,观测站是观察者对象。当气象站的测量数据发生变化时,它会通知所有的观测站对象,观测站对象会更新自己的显示数据。
具体实现方式可以如下:
首先定义主题接口,包含注册观察者、移除观察者和通知观察者的方法:
```java
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
```
然后定义观察者接口,包含更新数据的方法:
```java
public interface Observer {
void update(float temperature, float humidity, float pressure);
}
```
接着实现具体的气象站类,实现主题接口,并在数据发生变化时通知所有的观测站:
```java
public class WeatherData implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<>();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
public void measurementsChanged() {
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
```
最后实现具体的观测站类,实现观察者接口,并在数据发生变化时更新自己的显示数据:
```java
public class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
private float pressure;
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
```
通过以上实现,我们可以让气象站和观测站之间实现解耦,每个观测站只需要实现自己的显示逻辑,而不需要关心气象站的具体实现细节。同时,当气象站的测量数据发生变化时,所有的观测站都会自动更新自己的显示数据。