【发布时间】:2011-11-08 18:46:13
【问题描述】:
使用观察者模式。我有一个类,例如 Monitor,它正在监视一组对象。该类是一个观察者,其集合中的每个对象都是一个主题。目前,该集合被实现为 shared_ptr 的 std::list。在 Monitor 类的 Update 方法中,我想检查更新是否来自其集合中的对象之一。
std::list<SomeSharedPointer> items_;
...
void Monitor::Update(Subject *subject)
{
if(subject == something_)
{
DoSomething();
}
else if
??
// if subject is one of the objects in our collection then do something..
}
这里的主题是一个原始指针,我的集合是一个 shared_ptr 列表。如何有效地检查进入的主题是否是我收藏中的任何一个对象?
(请注意我的编译器 msvc,如果有需要的算法解决方案,则支持 lambdas)
更新
我应该补充一点,我意识到我可以在容器上使用 for 循环,但我想知道是否有更时髦的方式。
更新 2
SomeSharedPointer 是std::shared_ptr<SomeType> 的类型定义,其中SomeType 派生自抽象类Subject(标准观察者模式实现)。 SomeType 会在某个时候调用Notify(),这将为每个观察者调用Update() 方法。
【问题讨论】:
-
听起来像是一个坏掉的设计。普通观察者不必进行检查。从长远来看,最好为该类型添加特殊的观察者
-
有可能。它是一个需要根据其监控的项目状态做出决策的管理器类。
标签: c++ observer-pattern shared-ptr