深入解读观察者模式实例代码及其注释

5星 · 超过95%的资源 | 下载需积分: 9 | RAR格式 | 2.4MB | 更新于2025-05-12 | 96 浏览量 | 88 下载量 举报
收藏
观察者模式(Observer Pattern)是一种行为设计模式,允许对象之间存在一对多的依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。这种模式属于行为型模式,是一种对象行为型模式。在软件工程中,观察者模式是被广泛应用的设计模式之一。 在观察者模式中,通常有以下两个主要角色: 1. 观察者(Observer):接口或抽象类,规定了更新数据的方法,也就是当主题状态改变时需要通知的方法。 2. 主题(Subject):维护观察者的引用列表,能够添加、移除观察者,并在状态改变时通知所有注册的观察者。 观察者模式实例代码将涉及到以下几个方面: 1. 定义主题接口,包含添加、删除和通知观察者的方法。 2. 实现具体的主题类,管理观察者列表并实现主题接口。 3. 定义观察者接口,包含更新数据的方法。 4. 实现具体的观察者类,实现更新方法。 假设有一个天气站应用,它会提供实时的温度和湿度数据。这个应用可能会有很多用户同时关心这些数据,每当温度和湿度更新时,所有关心的用户(观察者)都应该被通知到。下面是这个应用中实现观察者模式的示例代码,附带详细注释。 ```java // 主题接口,定义了添加、删除和通知观察者的方法。 interface Subject { // 添加观察者 void registerObserver(Observer o); // 移除观察者 void removeObserver(Observer o); // 通知所有观察者 void notifyObservers(); } // 观察者接口,定义了更新数据的方法。 interface Observer { // 当主题状态改变时,该方法被调用以更新观察者的状态。 void update(float temp, float humidity, float pressure); } // 实现具体的主题类,用于维护观察者列表并通知观察者。 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) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } // 通知所有注册的观察者 @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(temperature, humidity, pressure); } } // 当气象站有更新时,这会调用每个观察者的update方法。 public void measurementsChanged() { notifyObservers(); } // 更新气象站测量值的方法 public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } } // 实现具体的观察者类,用于接收主题的更新。 class CurrentConditionsDisplay implements Observer { private float temperature; private float humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this); } // 更新温度和湿度信息 @Override public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; display(); } // 显示更新后的温度和湿度信息 public void display() { System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity"); } } ``` 上述代码展示了观察者模式的基本实现,主题(WeatherData)维护了一个观察者列表,并在状态改变时通知所有观察者。观察者(CurrentConditionsDisplay)实现了一个更新方法,该方法在收到主题状态更新时被调用,以实现观察者的响应。 这个模式的优势在于解耦了主题和观察者之间的关系。主题不需要知道任何关于观察者的具体信息,只需要知道有观察者实现了Observer接口。这样,任何符合Observer接口的类都可以成为观察者,满足了“开闭原则”——对扩展开放,对修改封闭。 不过,在某些情况下,观察者模式可能导致内存泄漏。例如,在图形用户界面(GUI)中,如果用户关闭了窗口,但主题类没有正确地移除观察者,那么可能会导致无用的内存占用。 总结来说,观察者模式是一种简单且强大的模式,它提供了一种对象之间的一对多通知机制,当一个对象改变状态时,所有依赖者都会得到通知。这种模式在很多应用程序中都很有用,尤其是事件驱动和图形界面的应用程序。

相关推荐

shijie_263
  • 粉丝: 1
上传资源 快速赚钱