【问题标题】:C++ Observer pattern listener event methods/class or signals & slotsC++ 观察者模式侦听器事件方法/类或信号和插槽
【发布时间】:2012-01-20 17:32:32
【问题描述】:

嘿,我正在我的游戏中实现 MVC,但我无法让这个东西在我的脑海中运行。我将视图与游戏逻辑解耦,控制器也解耦了。事情确实有效,但我无法确定侦听器模式或信号和插槽是否更适合我的情况。

我有几个纯虚方法的基类实体:

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

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

【问题讨论】:

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


    【解决方案1】:

    根据我的经验,您应该在抽象类中使用一些混合信号/插槽,主要是因为侦听器模式在 C++ 上效果不佳,因为内部类对外部类的可见性为零(例如在 Java 中,例如),使得插入听众成为一项非常艰巨的任务。所以,你可以使用很棒的 Gallant Signals,witch 是委托/信号模式的一个非常快速的实现:

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

    在您使用提供者的代码上:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多