【发布时间】:2020-12-08 12:30:55
【问题描述】:
我想问当我需要实现这样的事情时,我应该如何正确地实现观察者模式:
WeatherStation[temperature, humidity ...]
而且我需要能够独立地“观察”每个属性。因此,当温度变化时,只会通知温度观察者,当湿度变化时,只会通知湿度订阅者。
我的想法是创建一些类,例如 ObservableTemperature 和接口 TemperatureObserver,但这样我就必须为每个属性创建两个“类”。
第二个选项是只为每个属性创建两个接口(例如 TemperatureSource、TemperatureObserver ...),然后在 WeatherStation 类中实现 xxxSource 接口,但这样它不能重用,我需要在 WeatherStation 类中具有许多数组(与“可观察”属性相同的数量)跟踪观察者。
还有更好的选择吗?
编辑: 此外,我也会有类似 Display 类的东西,它会订阅多个属性(不是全部),并且仍然需要区分其中哪一个被更新。
【问题讨论】:
-
好吧,您可以使用标准/通用类,只需为各个属性注册观察者,或者如果您想让它更安全,请使用泛型,例如
ObservableProperty<Temperature>和PropertyObserver<Temperature>. -
这样我就需要为每种类型创建类,对吗?因为例如如果两个属性是相同的类型(浮点数),我将无法区分它们。附言我认为 Java 中不存在 PropertyObserver<...>,至少我找不到它。
-
是的,如果您需要属性是类型安全的,您需要为每种类型创建一个类。在大多数情况下,您不需要这样做,只需为不同的属性注册相同观察者接口的实例(例如,类似这样的伪代码
getObservable("temperature").register(new Observer<Float>() { ... })。是的,PropertyObserver可能不存在,但如果你不能使用您也可以自己推出任何现有的类和接口。 -
这听起来很有趣,如果没有更好的解决方案建议,我可能会走这条路。但是我仍然认为我必须为属性创建这些类,即使我不需要它是类型安全的,因为我无法说出 Observer
何时由温度触发,何时由湿度触发,如果我是对的. -
嗯,你通常会在每个属性上注册不同的观察者,所以如果你在“湿度”上触发观察者,你可以假设你得到的是湿度的变化。为了获得更多安全性,您可以查看是否也可以传递属性名称,例如类似于
PropertyChangedEvent("humidity")来收听或ObservableProperty("humidity")来订阅。
标签: java design-patterns observer-pattern