12 Java设计模式之观察者模式
在上一篇文章中,我们探讨了Java设计模式中的工厂模式,它帮助我们创建对象,使得代码更加灵活和可维护。而在本篇文章中,我们将讨论 观察者模式,这是一种常用的设计模式,可以让我们更好地处理对象之间的关系。
观察者模式简介
观察者模式是一种行为设计模式,其中一个对象(称为“主题”或“被观察者”)维持一系列依赖于它的对象(称为“观察者”),并在其状态发生变化时,自动通知这些观察者。这样的设计促进了对象之间的解耦,使得系统更加灵活。
观察者模式的组件
-
主题(Subject): 主题是被观察的对象,负责维护观察者的集合,以及添加、删除观察者的功能。
-
观察者(Observer): 观察者是依赖于主题的对象,当主题的状态改变时,它会收到通知。
-
具体主题(ConcreteSubject): 具体实现主题的类,负责存储状态、更新状态并通知所有的观察者。
-
具体观察者(ConcreteObserver): 具体实现观察者的类,定义响应主题变化的行为。
观察者模式的实现
让我们通过一个简单的 Java 示例来说明观察者模式的实现。在这个示例中,我们将模拟天气站的工作,天气站作为主题会通知显示的设备(观察者)当前的温度变化。
import java.util.ArrayList;
import java.util.List;
// 观察者接口
interface Observer {
void update(float temperature);
}
// 主题接口
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
// 具体主题
class WeatherData implements Subject {
private List<Observer> observers;
private float temperature;
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);
}
}
// 更新天气数据
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObservers();
}
}
// 具体观察者
class CurrentConditionsDisplay implements Observer {
private float temperature;
@Override
public void update(float temperature) {
this.temperature = temperature;
display();
}
public void display() {
System.out.println("Current temperature: " + temperature + "°C");
}
}
// 测试观察者模式
public class ObserverPatternTest {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
weatherData.registerObserver(currentDisplay);
weatherData.setTemperature(25.0f);
weatherData.setTemperature(30.0f);
}
}
代码解读
-
我们定义了一个
Observer
接口和一个Subject
接口,后者提供注册、撤销和通知观察者的方法。 -
WeatherData
类实现了Subject
接口,维护一个观察者列表和当前温度的状态。在setTemperature
方法中,当温度更新时,它会调用notifyObservers
方法,通知所有注册的观察者。 -
CurrentConditionsDisplay
类实现了Observer
接口,一旦接收到温度更新,它就会调用display
方法打印当前温度。 -
ObserverPatternTest
类则是主程序,创建WeatherData
实例并注册观察者,然后通过调用setTemperature
方法更改温度。
观察者模式的优缺点
优点:
- 解耦:观察者模式遵循了 单一职责原则,主题与观察者之间的耦合度低。
- 灵活性:可以方便地添加或删除观察者。
缺点:
- 通知成本:当观察者数量较多时,通知的开销可能会影响性能。
- 可能的内存泄漏:观察者在不再需要时未能正确解除注册,会导致内存泄漏。
总结
在本篇文章中,我们详细探讨了观察者模式,这种模式在实际应用中非常有用,能够很好地支持一对多的依赖关系。在下篇文章中,我们将继续探讨 JVM调优之JVM的工作原理,了解JVM如何管理和优化内存,以提升Java应用的性能。希望本篇文章能够帮助大家掌握观察者模式的概念及其实现。