12 Java设计模式之观察者模式

在上一篇文章中,我们探讨了Java设计模式中的工厂模式,它帮助我们创建对象,使得代码更加灵活和可维护。而在本篇文章中,我们将讨论 观察者模式,这是一种常用的设计模式,可以让我们更好地处理对象之间的关系。

观察者模式简介

观察者模式是一种行为设计模式,其中一个对象(称为“主题”或“被观察者”)维持一系列依赖于它的对象(称为“观察者”),并在其状态发生变化时,自动通知这些观察者。这样的设计促进了对象之间的解耦,使得系统更加灵活。

观察者模式的组件

  1. 主题(Subject)
    主题是被观察的对象,负责维护观察者的集合,以及添加、删除观察者的功能。

  2. 观察者(Observer)
    观察者是依赖于主题的对象,当主题的状态改变时,它会收到通知。

  3. 具体主题(ConcreteSubject)
    具体实现主题的类,负责存储状态、更新状态并通知所有的观察者。

  4. 具体观察者(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);
}
}

代码解读

  1. 我们定义了一个 Observer 接口和一个 Subject 接口,后者提供注册、撤销和通知观察者的方法。

  2. WeatherData 类实现了 Subject 接口,维护一个观察者列表和当前温度的状态。在 setTemperature 方法中,当温度更新时,它会调用 notifyObservers 方法,通知所有注册的观察者。

  3. CurrentConditionsDisplay 类实现了 Observer 接口,一旦接收到温度更新,它就会调用 display 方法打印当前温度。

  4. ObserverPatternTest 类则是主程序,创建 WeatherData 实例并注册观察者,然后通过调用 setTemperature 方法更改温度。

观察者模式的优缺点

优点:

  • 解耦:观察者模式遵循了 单一职责原则,主题与观察者之间的耦合度低。
  • 灵活性:可以方便地添加或删除观察者。

缺点:

  • 通知成本:当观察者数量较多时,通知的开销可能会影响性能。
  • 可能的内存泄漏:观察者在不再需要时未能正确解除注册,会导致内存泄漏。

总结

在本篇文章中,我们详细探讨了观察者模式,这种模式在实际应用中非常有用,能够很好地支持一对多的依赖关系。在下篇文章中,我们将继续探讨 JVM调优之JVM的工作原理,了解JVM如何管理和优化内存,以提升Java应用的性能。希望本篇文章能够帮助大家掌握观察者模式的概念及其实现。

12 Java设计模式之观察者模式

https://zglg.work/java-one/12/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论