C ++ Observer模式监听器事件方法/类或信号&插槽

时间:2012-01-20 17:32:32

标签: c++ signals-slots observer-pattern

Hy,我正在我的游戏中实现MVC而且我不能让这件事情在脑子里工作。我将视图与游戏逻辑分离,控制器与之分离。事实上是有效的,但我不能决定听众模式或信号&插槽对我来说更好。

我有基类Entity,几乎没有纯虚方法:

onEntityCreate //Called when new entity is allocated
onEntityDelete //Called when new entity is deallocated
onEntityBuild //Called on respawn or spawn
onEntityDispose //Called before respawn or deallocation
onEntityTick //called every tick when is entity "alive"
onEntityUpdate //called when entity position/orientation updates

我想在两个不同的线程中运行视图和逻辑。如果我可以在逻辑结束时发送这些事件,请查看,但我不知道如何。

1 个答案:

答案 0 :(得分:2)

根据我的经验,你应该在抽象类中使用一些混合信号/插槽,主要是因为监听器模式在C ++上不能很好地工作,因为内部类对外部类没有可见性(如在Java中,每个示例) ),使听众的插入成为一项非常艰巨的任务。所以,你可以使用伟大的Gallant Signals,这是一个非常快速的代表/信号模式实现:

class EntityProvider {
public:
    Gallant::Signal0< Entity* > onEntityCreate;
};

以及您使用提供商的代码:

void Example::bindProvider(EntityProvider* provider) {
  provider->onEntityCreate.Connect(this, &Example::onEntityCreate);
}

此外,为了获得更好的OO设计,您应该使用“gluer”类,该类负责将类绑定/解除绑定到其提供者。这很好地集中了事件管理并避免了难以调试的问题。