在上一篇文章中,我们探讨了Java设计模式中的工厂模式,它帮助我们创建对象,使得代码更加灵活和可维护。而在本篇文章中,我们将讨论 观察者模式,这是一种常用的设计模式,可以让我们更好地处理对象之间的关系。
观察者模式简介
观察者模式是一种行为设计模式,其中一个对象(称为“主题”或“被观察者”)维持一系列依赖于它的对象(称为“观察者”),并在其状态发生变化时,自动通知这些观察者。这样的设计促进了对象之间的解耦,使得系统更加灵活。
观察者模式的组件
主题(Subject):
主题是被观察的对象,负责维护观察者的集合,以及添加、删除观察者的功能。
观察者(Observer):
观察者是依赖于主题的对象,当主题的状态改变时,它会收到通知。
具体主题(ConcreteSubject):
具体实现主题的类,负责存储状态、更新状态并通知所有的观察者。
具体观察者(ConcreteObserver):
具体实现观察者的类,定义响应主题变化的行为。
观察者模式的实现
让我们通过一个简单的 Java 示例来说明观察者模式的实现。在这个示例中,我们将模拟天气站的工作,天气站作为主题会通知显示的设备(观察者)当前的温度变化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| 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应用的性能。希望本篇文章能够帮助大家掌握观察者模式的概念及其实现。