观察者模式(Observer)
定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都可以得到通知并自动更新。
使用场景
主要角色
- Subject(主题)
- ConcreteSubject(具体主题)
- Observer(观察者)
- ConcreteObserver(具体观察者)
类图
示例代码
java
public interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
java
public class WeatherStation implements Subject {
private List<Observer> observers = new ArrayList<>();
private String temperature;
private String condition;
public void setWeatherData(String temperature, String condition) {
this.temperature = temperature;
this.condition = condition;
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, condition);
}
}
}
java
public interface Observer {
void update(String temperature, String condition);
}
java
public class TemperatureDisplay implements Observer {
@Override
public void update(String temperature, String condition) {
System.out.println("Temperature Display: Current Temperature is " + temperature);
}
}
java
public class WeatherConditionDisplay implements Observer {
@Override
public void update(String temperature, String condition) {
System.out.println("Weather Condition Display: Current Weather Condition is " + condition);
}
}
java
public class Client {
public static void main(String[] args) {
// 创建主题
WeatherStation weatherStation = new WeatherStation();
// 创建观察者
Observer temperatureDisplay = new TemperatureDisplay();
Observer weatherConditionDisplay = new WeatherConditionDisplay();
// 注册观察者
weatherStation.addObserver(temperatureDisplay);
weatherStation.addObserver(weatherConditionDisplay);
// 模拟天气数据更新
weatherStation.setWeatherData("25°C", "Sunny");
}
}
Temperature Display: Current Temperature is 25°C
Weather Condition Display: Current Weather Condition is Sunny