目录
观察者模式(Observer Pattern)定义
观察者模式是一种行为设计模式,允许多个对象监听某一个对象的状态变化。当被观察对象(即主题)的状态发生变化时,所有依赖于它的观察者对象都会被通知并更新。
应用场景
观察者模式广泛应用于实现事件处理系统,其中一个对象的状态变化需要影响其他一个或多个对象的行为,而不需要这些对象之间有紧密的耦合关系。常见的应用场景包括用户界面元素的交互,模型-视图-控制器(MVC)模式中模型的更新通知,或任何其他需要跨系统部分通知更改的场合。
Java 代码案例
假设我们有一个简单的天气监测系统,其中一个天气站对象会记录天气数据,并在数据更新时通知所有注册的观察者。
首先,定义观察者和被观察者接口:
// 观察者接口
interface Observer {
void update(float temperature, float humidity, float pressure);
}
// 被观察者接口
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
实现具体的被观察者:
class WeatherData implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
// 更新天气数据
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObservers();
}
}
实现具体的观察者:
class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
@Override
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 ObserverPatternDemo {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
weatherData.registerObserver(currentDisplay);
// 模拟新的气象测量数据
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
总结
在这个例子中,WeatherData
充当被观察者(Subject),管理观察者的注册、移除和通知。CurrentConditionsDisplay
是观察者,它根据 WeatherData
的状态更新自己的显示。当 WeatherData
的状态变化时,它通过调用 notifyObservers()
方法通知所有注册的观察者。
观察者模式使得天气数据的更新和显示之间解耦,增加了代码的灵活性和可扩展性,使得添加新的显示元素或其他依赖于天气数据的组件变得简单。这种模式广泛应用于实现各种发布-订阅系统,提高了组件间的交互效率和可维护性。
非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~