看过直播的同学都知道,直播房间里有个订阅按钮,当你点击订阅之后,下次主播再开播时你就能在第一时间收到通知,以免你错过精彩内容。这就是观察者模式的一种经典应用。
示例程序
场景
假设我们有一个记录天气的气象站,它会收集湿度、温度、气压这三个天气数据,需要在不同类型的显示装置中展示天气。如下图所示
现在我们有一个记录天气变化的类 WeatherData。还有不同类型的显示装置类 FullConditionsDisplay 和 PartConditionsDisplay。
类结构图
Observer
1 | public interface Observer { |
Subject
1 | public interface Subject { |
DisplayElement
1 | public interface DisplayElement { |
天气
1 | public class WeatherData implements Subject { |
观察者 1 号
1 | //展示全部的天气数据。 |
观察者 2 号
1 | //展示部分天气数据。(温度和湿度) |
Main
1 | public class Main { |
运行结果
扩展
- JDK 内置了 Observer 模式,但是却在 JDK9 之后将其标记为 @Deprecated,为什么呢?
- Observable 被定义成一个类,而不是接口。由于 Java 是单继承的,JDK 内置的实现不够灵活(比如你还想额外继承一个自己的类),无法满足特定场景。
- Observable 没有实现 Serializable 接口,无法进行序列化,导致其无法适用于网络编程。
- 既然如此,有能替代它的吗?有,在 java.beans 包中。
- PropertyChangeListener(Observer)。
- PropertyChangeSupport(Observable)。