【发布时间】:2015-08-26 18:00:30
【问题描述】:
我基本上是在尝试实现一个通用的观察者模式。
class Observer {
public:
template <class T>
virtual void OnEvent(const EventHandle& h, T& affectedItem) = 0;
};
class Subject {
public:
void AddObserver(Observer* o) {
observers.Add(o);
}
void RemoveObserver(Observer* o) {
observers.Remove(o);
}
template <class T>
void Notify(const EventHandle& h, T& affectedItem) {
for (Observer* o : observers) {
o->OnEvent(h, affectedItem);
}
}
private:
set<Observer*> observers;
};
在Observer::OnEvent() 中,我想获取在事件中受到影响的项目(比如我刚刚在库存中添加了一些东西,并且需要在 GUI 中反映添加的内容——我会调用 Subject::Notify(itemAddedEvent, newItem)) .我知道我需要对类进行一些重构/重新设计,但我坚持如何去做。有什么方法可以解决这个问题?
【问题讨论】:
-
stackoverflow.com/a/32081759/1774667 能解决您的问题吗?基本上,“主题”或“广播者”在其消息中被模板化。接收者也在消息上输入(在我的情况下,接收者只是可调用的对象,以便轻松使用 lambda,删除观察者包括销毁返回的
shared_ptr<void>而不是返回到广播者,因为我发现确保广播者寿命长的接收器是错误的主要来源)
标签: c++ templates observer-pattern virtual-functions