我想问一下当我需要实现以下目标时应如何正确实现观察者模式:
WeatherStation[temperature, humidity ...]
并且我需要能够独立地“观察”每个属性。因此,当温度变化时,只会通知温度观测者,而当湿度变化时,只会通知湿度用户。
我的想法是,我将创建一些类,例如ObservableTemperature和接口TemperatureObserver,但是通过这种方式,我将必须为每个属性创建两个“类”。
第二种选择是为每个属性仅创建两个接口(诸如TemperatureSource,TemperatureObserver之类的东西),然后在WeatherStation类中实现xxxSource接口,但是这种方式不可重用,并且我将需要在WeatherStation类中使用很多数组(与“可观察”属性相同的数字)跟踪观察者。
有没有更好的选择?
编辑:同样也可能发生类似Display类的事件,该事件将订阅多个属性(不是全部),并且仍然需要区分其中哪一个已更新。
将temperature
,humidity
等组合到一个类中WeatherStation
定义一个域概念。就观察者模式而言,这是一门学科。另一方面,发送由单个值组成的通知将WeatherStation
分为多个域概念和多个主题。显然,这两个设计决策之间存在冲突。
GoF模式是根据对象(而非字段)定义为主题的。但是请注意,这并不限制主题在不同时间通知不同的观察者。本书的相关部分从第298页开始。
明确指定感兴趣的修改。您可以通过扩展主题的注册界面以仅针对感兴趣的特定事件注册观察者来提高更新效率。当发生此类事件时,主题仅通知那些对该事件感兴趣的观察者。一种支持此方法的方法是使用Subject对象的方面概念。为了记录对特定事件的兴趣,观察员通过使用
void Subject::Attach(Observer*, Aspects interest);
其中
interest
指定感兴趣的事件。在通知时,主题会将更改的方面作为更新操作的参数提供给其观察者。例如:void Observer::Update(Subject*, Aspect& interest);
这种方法使不同的观察者可以注册来自一个的不同通知Subject
。请注意,无论观察者注册于哪个方面,它都会Subject
在通知消息中收到相同的内容。由观察者决定从中读取必要的字段Subject
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句