我有兴趣了解其他人如何设计他们的软件。我在不同的项目中使用了不同的解决方案,但我觉得我可以做得更好。我的实现涉及委托和观察者的使用,但今天我无法抗拒问你如何写它。
我们假设我们有以下内容:
class Sensor
{
...
public:
void sensorTriggered();
};
Class Device
{
...
public:
void notifyChangesFromHardware(unsigned int inNotificationInfo);
protected:
Sensor *fireAlarm_;
};
int main()
{
Device someDevice;
return 0;
}
如果你想调用“Device :: notifyChangesFromHardware”,你会如何设计它? 来自Sensor对象(fireAlarm_)?
谢谢
答案 0 :(得分:0)
我会像Piotr S.建议的那样看看Boost Signals。另外,我使用的一个简单模式在你的情况下看起来像这样:
template<class NotifyDelegate>
class Sensor
{
...
public:
// assumes you only have one notify delegate
Sensor( NotifyDelegate &nd ) : nd_(nd)
{
}
void sensorTriggered()
{
unsigned int notifyInfo = 99;
nd_.notifyChangesFromHardware( notifyInfo );
}
private:
NotifyDelegate &nd_;
};
Class Device
{
...
public:
void notifyChangesFromHardware(unsigned int inNotificationInfo);
};
int main()
{
Device someDevice;
Sensor<Device> someSensor(someDevice);
someSensor.sensorTriggered();
return 0;
}
同时查看Observer Pattern。
答案 1 :(得分:0)
我会使用函数指针或函数对象:
struct Notifier_Base
{
virtual void notify(void) = 0;
};
class Sensor
{
std::vector<Notifier_Base *> notifiers;
void publish(void)
{
std::vector<Notifier_Base *>::iterator iter;
for (iter = notifiers.begin();
iter != notifiers.end();
++iter)
{
(*iter)->notify();
}
};
请参阅设计模式:发布者/消费者,发布者/订阅者。