📅  最后修改于: 2023-12-03 15:27:54.707000             🧑  作者: Mango
观察者模式是一种行为型设计模式,它允许你定义一种订阅机制,让一些对象能够被自动通知,当一个被观察的对象发生了改变。
这个模式非常实用,在许多现代应用程序和框架中都有广泛的使用,如事件驱动的编程方式,其中组件可以通过发布事件的方式与订阅者交互。
在实现观察者模式时,使用两种类型的组件,即主题(Subject)和观察者(Observer)。
主题是程序中的一个类,它包含了一些可被观察的状态和行为。当主题的状态或行为改变时,它会通知它所知道的某些观察者。
观察者是一个接口,其包含了一个更新(update)方法,当被观察的对象的状态或行为改变时,它的 update 方法将被调用。
在这里,我们将实现一个简单的观察者模式示例,它将模拟一个气象站,用于记录气温、湿度和气压的变化,并将该数据获取的所有观察者实时通知。
以下是我们将要实现的类 UML 图:
在代码实现中,我们将实现一个基本的观察者模式,包括以下类:
/**
* 主题
*/
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
/**
* 观察者
*/
public interface Observer {
void update(float temp, float humidity, float pressure);
}
/**
* 具体主题
*/
public class WeatherData implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<Observer>();
}
public void registerObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers() {
for (Observer o : observers) {
o.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();
}
}
/**
* 具体观察者
*/
public class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
public CurrentConditionsDisplay(Subject weatherData) {
weatherData.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
以下是使用上述代码的示例:
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
}
}
该程序将输出以下数据:
Current conditions: 80.0F degrees and 65.0% humidity
Current conditions: 82.0F degrees and 70.0% humidity
Current conditions: 78.0F degrees and 90.0% humidity
注意,在该示例中,CurrentConditionsDisplay 只是一个观察者,它仅仅输出气象站提供的最新数据。
观察者模式可以很好地应用在各种场景中,如企业级应用程序、桌面应用程序等。它允许组件之间的松耦合,并支持事件驱动的编程方式。因此,在编写应用程序时,您需要考虑到观察者模式,并根据您的需求灵活地使用它。