observer模式:独立观察属性

eanckbw9  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(310)

我想问一下,当我需要实现以下目标时,我应该如何正确地实现观察者模式:

WeatherStation[temperature, humidity ...]

我需要能够独立地“观察”每个属性。因此,当温度变化时,只通知温度观察员,当湿度变化时,只通知湿度订户。
我的想法是创建一些类,比如ObservateTemperature和interface temperatureobserver,但这样我必须为每个属性创建两个“类”。
第二种方法是为每个属性只创建两个接口(比如temperaturesource,temperatureobserver…),然后在weatherstation类中实现source接口,但这样它就不可重用,而且我需要在weatherstation类中有很多数组(与“observable”属性相同的数目)来跟踪观察者。
有更好的选择吗?
edited:也有可能我会有类似display类的东西,它会订阅多个属性(不是全部),并且仍然需要区分其中哪一个被更新。

yhuiod9q

yhuiod9q1#

结合 temperature , humidity 等组成一个班级 WeatherStation 定义一个域概念。就观察者模式而言,这是一个主题。另一方面,发送由单个值组成的通知将导致 WeatherStation 分为多个领域概念和多个主题。显然,这两个设计决策之间存在冲突。
gof模式是以对象(而不是字段)作为主题来定义的。但请注意,这并不限制受试者在不同时间通知不同的观察者。这本书的相关部分从第298页开始。
明确指定感兴趣的修改。您可以通过扩展主题的注册接口来提高更新效率,以便只允许为感兴趣的特定事件注册观察者。当此类事件发生时,受试者仅通知对该事件感兴趣的观察者。支持这一点的一种方法是使用主客体方面的概念。为了记录对特定事件的兴趣,观察者会使用

void Subject::Attach(Observer*, Aspects interest);

哪里 interest 指定感兴趣的事件。在通知时,主体将更改的方面作为更新操作的参数提供给其观察者。例如:

void Observer::Update(Subject*, Aspect& interest);

这种方法使不同的观察者能够从一个站点注册不同的通知 Subject . 请注意,无论观察者注册哪个方面,它都会收到相同的结果 Subject 在通知消息中。由观察者从图像中读取必要的字段 Subject .

相关问题