介绍: 观察者模式是一种行为型设计模式,用于实现对象之间的发布-订阅机制。在观察者模式中,一个对象(称为主题)维护一组依赖于它的对象(称为观察者),当主题的状态发生变化时,它会通知所有观察者并自动更新它们的状态。观察者模式使得主题和观察者之间解耦,从而实现对象之间的松耦合。
场景: 当一个对象的状态发生变化时,需要通知其他相关对象做出相应的反应时,观察者模式就可以派上用场。例如,在一个气象站应用程序中,当气温、湿度或气压发生变化时,需要通知显示屏和手机App更新相应的天气信息。
实现: 让我们通过一个简单的示例来理解观察者模式的实现。假设我们正在开发一个气象站应用程序,需要实时更新气温和湿度信息。首先,我们定义一个观察者接口:
public interface Observer {
void update(double temperature, double humidity);
}
然后,我们创建两个具体的观察者类,用于显示气温和湿度信息:
public class TemperatureDisplay implements Observer {
@Override
public void update(double temperature, double humidity) {
System.out.println("Temperature Display: Current temperature is " + temperature + "°C");
}
}
public class HumidityDisplay implements Observer {
@Override
public void update(double temperature, double humidity) {
System.out.println("Humidity Display: Current humidity is " + humidity + "%");
}
}
接下来,我们定义一个主题接口,用于添加、删除和通知观察者:
public interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
然后,我们创建具体的主题类,用于维护观察者列表并通知观察者:
import java.util.ArrayList;
import java.util.List;
public class WeatherStation implements Subject {
private double temperature;
private double humidity;
private List<Observer> observers;
public WeatherStation() {
observers = new ArrayList<>();
}
public void setMeasurements(double temperature, double humidity) {
this.temperature = temperature;
this.humidity = humidity;
notifyObservers();
}
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity);
}
}
}
在客户端代码中,我们创建主题对象(气象站)和观察者对象(显示屏和手机App),并让它们相互关联:
public class Client {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
Observer temperatureDisplay = new TemperatureDisplay();
Observer humidityDisplay = new HumidityDisplay();
weatherStation.addObserver(temperatureDisplay);
weatherStation.addObserver(humidityDisplay);
weatherStation.setMeasurements(25.5, 65);
weatherStation.setMeasurements(30, 70);
}
}
输出:
Temperature Display: Current temperature is 25.5°C
Humidity Display: Current humidity is 65.0%
Temperature Display: Current temperature is 30.0°C
Humidity Display: Current humidity is 70.0%
在上面的示例中,我们成功地使用了观察者模式,实现了气象站应用程序的实时更新。主题(WeatherStation
)维护了观察者列表,当气温或湿度发生变化时,它会通知所有观察者并更新它们的状态。
总结: 观察者模式是一种灵活而高效的设计模式,它实现了对象之间的发布-订阅机制,使得主题和观察者之间解耦。通过使用观察者模式,我们可以轻松地实现对象的状态更新和事件通知,同时也使得代码更加可扩展和可维护。在实际开发中,观察者模式可以应用于各种场景,例如GUI事件处理、消息队列等,是值得掌握的一种设计模式。