在软件开发中,设计模式是解决常见问题的经典解决方案。观察者模式(Observer Pattern)是行为型设计模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。Java中的观察者模式广泛应用于事件处理、GUI编程、消息传递等场景。本文将详细介绍Java观察者模式的概念、结构、实现方式以及应用场景。
观察者模式的核心思想是将观察者(Observer)与被观察者(Subject)解耦。被观察者维护一个观察者列表,并在状态发生变化时通知所有观察者。观察者则根据收到的通知执行相应的操作。
Java提供了内置的观察者模式支持,主要通过java.util.Observable
类和java.util.Observer
接口实现。下面通过一个简单的例子来演示如何使用Java内置的观察者模式。
import java.util.Observable;
import java.util.Observer;
// 被观察者类
class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
private void measurementsChanged() {
setChanged(); // 标记状态已改变
notifyObservers(); // 通知观察者
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
// 观察者类
class CurrentConditionsDisplay implements Observer {
private Observable observable;
private float temperature;
private float humidity;
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeatherData) {
WeatherData weatherData = (WeatherData) o;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
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);
}
}
Observable
类,作为被观察者。它维护了温度、湿度和气压等状态,并在状态变化时调用setChanged()
和notifyObservers()
方法通知观察者。Observer
接口,作为观察者。它在update()
方法中获取被观察者的最新状态并显示。WeatherData
对象和CurrentConditionsDisplay
对象,并模拟天气数据的变化。观察者模式适用于以下场景:
观察者模式是一种强大的设计模式,它通过解耦观察者和被观察者,使得系统更加灵活和可扩展。Java提供了内置的观察者模式支持,使得实现观察者模式变得更加简单。然而,在使用观察者模式时,也需要注意其潜在的缺点,如性能问题和内存泄漏。通过合理的设计和使用,观察者模式可以有效地解决许多实际问题。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4419899/blog/4596648