观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,会通知所有观察者,使它们能够自动更新自己的状态。
主题(Subject):
观察者(Observer):
具体主题(Concrete Subject):
具体观察者(Concrete Observer):
// 主题接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 观察者接口
public interface Observer {
void update(String message);
}
import java.util.ArrayList;
import java.util.List;
// 具体主题实现
public class WeatherStation implements Subject {
private List<Observer> observers;
private String weatherMessage;
public WeatherStation() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(weatherMessage);
}
}
public void setWeatherMessage(String weatherMessage) {
this.weatherMessage = weatherMessage;
notifyObservers(); // 通知观察者状态更新
}
}
// 具体观察者实现
public class PhoneDisplay implements Observer {
private String weatherMessage;
@Override
public void update(String message) {
this.weatherMessage = message;
display();
}
public void display() {
System.out.println("Phone Display: " + weatherMessage);
}
}
public class Main {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
// 创建具体观察者
PhoneDisplay phoneDisplay = new PhoneDisplay();
// 注册观察者
weatherStation.registerObserver(phoneDisplay);
// 模拟天气更新,并通知观察者
weatherStation.setWeatherMessage("Today is sunny");
// 如果需要,可以注销观察者
// weatherStation.removeObserver(phoneDisplay);
}
}
Phone Display: Today is sunny
在这个例子中:
WeatherStation 类实现了 Subject 接口,维护一个观察者列表,并负责通知观察者状态变化。PhoneDisplay 类实现了 Observer 接口,具体实现了在收到通知时如何更新和显示信息。Main 类中,创建了 WeatherStation 和 PhoneDisplay 对象,注册观察者并模拟天气更新,观察者接收到通知后更新并显示最新的天气信息。观察者模式非常有用,特别是在需要一对多通知的场景,如事件处理、GUI 界面更新、分布式系统中的状态同步等。