【发布时间】:2012-05-11 16:53:44
【问题描述】:
当观察者希望观察不同的项目时,我尝试为观察者模式编写 sudo 代码。
忽略语法错误。我想知道这是否是实现这一点的正确方法。如果没有,请提出更好的方法。
// Used by the subject for keeping a track of what items the observer wants to observe
typedef struct observerListStruct
{
bool getTemperatureUpdate;
bool getHumidityUpdate;
bool getPressureUpdate;
observer's-function pointer's address;
};
// Subject's class
class weatherData
{
public:
// Observers will call this function to register themselves. The function pointer will point to the function which will get called when updates are available.
void registerObservers (observer obj, observer's-FunctionPointer)
{
// This observer's function returns which items to observe.
char* f = obj.returnItemsToObserve ();
if f[0] = `1`
observerListStruct.getTemperatureUpdate = true;
}
void unregisterObservers (observer obj) {}
private:
vector <observerListStruct> observerList;
float temperature;
float humidity;
float pressure;
void notifyObservers () {}
float getTemperature () {}
float getHumidity () {}
float getPressure () {}
} weatherDataObject;
// Base class for observers containing common functions
class observers
{
char ItemsToObserve [3] = {1, 2, 3};
// This observer's function returns which items to observe. Default - return all items
virtual char* returnItemsToObserve ()
{
return ItemsToObserve;
}
};
class observerDisplayElementCurrentConditions : public observers
{
char ItemsToObserve [3] = {1, 2};
char* returnItemsToObserve ()
{
return ItemsToObserve;
}
// this function will be used as a function pointer for getting updates
void getUpdatesAndDisplayWeatherData (float, float) {}
};
【问题讨论】:
-
Subject不应该知道哪个观察者对Subject的哪个属性感兴趣。每个ConcreteObserver都知道它感兴趣的ConcreteSubject的属性。ConcreteSubject应该有公共getter,所以ConcreteObserver可以获取这些属性的最新值(当ConcreteSubject触发事件或调用Subject::Notify()方法时 - Google for Gang Of Four Observer 实施)。registerObservers应该只是将新的ConcreteObserver添加到观察者列表中。每个ConcreteObserver可以注册多个ConcreteSubjects。 -
@BojanKomazec 你所说的“公共吸气剂”是什么意思?请解释。当主体调用“通知”函数时,会发生什么?
-
我的意思是公共访问器方法。请参阅下面的 AquilaRapax 的答案并查找
WheatherData::getTemperature()、WheatherData::getHumidity()等。Notify()遍历所有已注册观察者的列表并在它们上调用Update()。每个ConcreteObserver都实现了Update(),在这个方法中它通过这些getter 获取ConcreteSubject属性的最新值。 -
很高兴它有帮助。也许我应该发布一些代码......它更容易理解。我可能会这样做,以供参考。
-
@BojanKomazec 你说:“主体不应该知道哪个观察者对哪个主体的属性感兴趣”。但是,如果我们谈论报纸出版商(他们是主题)——他们难道不会[跟踪哪些报纸应该发送给哪个订阅者?
标签: c++ oop design-patterns observer-pattern