我创建了两个抽象类Subject和Observer,它们定义了经典的Observer模式接口。我从中派生出实现Observer模式的方法。观察者可能看起来像这样:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
很好,它告诉我谁更改了某些内容。但是,它没有告诉我发生了什么变化。有时这是可以的,因为我只是要查询主题以获取最新数据,但是其他时候我需要知道主题上发生了什么变化。我注意到在Java中,它们同时具有notifyObservers()方法和notifyObservers(Object arg)方法,以大概指定有关更改内容的详细信息。
就我而言,我需要知道是否有几个不同的动作中的一个发生在主体上,如果是特定动作,则需要知道与该动作相关的整数。
所以我的问题是:
- 传递通用参数的C ++方法是什么(就像Java一样)?
- 观察者甚至是最好的模式吗?也许某种事件系统?
更新
我找到了这篇文章,该文章讨论了如何对观察者模式进行模板化:使用模板实现主题/观察者模式。这让我想知道是否可以模板化参数。
我发现了这个关于模板参数模板化的堆栈溢出问题:基于模板的主题观察者模式-我应该使用static_cast还是dynamic_cast。但是,OP似乎有一个没有人回答的问题。
我可以做的另一件事是将Update方法更改为采用EventArg对象,如下所示:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
然后为特定的参数数据创建EventArg的子类,然后将其投射回update方法中的特定子类。
更新2
还发现了一篇关于创建基于异步消息的c ++框架的文章;第2部分将具有主题讨论交流有关细节什么改变。
我现在正在认真考虑使用Boost.Signals。简单的时候使用我自己的观察者模式很有意义,但是模板化类型和参数开始变得复杂。我可能需要Boost.Signals2的线程安全性。
更新3
我还发现了一些关于观察者模式的有趣文章:
但是,我已将实现切换为使用Boost.Signals,尽管出于我的目的可能有点blo肿,但它可以成功运行。可能有关膨胀或速度的任何问题都是无关紧要的。