即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

CEGUI订阅者模式

编程语言 tanpan004 18℃ 0评论

我一直在用CEGUI库做游戏的UI,这篇文章主要是记录是CEGUI库的消息发布机制。与其说CEGUI在消息发布上使用的是订阅者模式,倒不如说是“发布者模式”,因为CEGUI使EvenSet类作为一个消息的发布者。而订阅者可以是任何一个对象(绑定到该对象上的成员函数上。),但是CEGUI却不提供一个可靠的订阅者,我在0.8.4 版本的demo上并没有找到作为一个订阅者去维护一个Connection引用,去宝珠其销毁的时候使这些Connection能够disconnect()。但是在设计上作者确实考虑到这种情况去保证他能够去disconect(),因为Connection只是BoundSlot的引用计数。

 typedef RefCounted<BoundSlot> Connection;

在应用上,只局限于CEGUI去考虑应该就能理解为什么会这样做了,对于一个界面上的所有的window其实都是同时构造和析构的 。


我们在使用的时候难免会去扩展,就不得不考虑这个问题了。但其实维护一个Connection也不是什么困难的事情。

class EventSubscriber
{
public:
    EventSubscriber(void){}
    ~EventSubscriber(void)
    {
        //这里是去disconnect()这些消息。
        Event::clearSlotContainer(container); 
    }

    //订阅消息
    void SubscriberEvent(size_t event_id,EventSet* set,SlotFunction slot)
    {
        if (set)
        {
            container.push_back(set->BindEvent(event_id,slot));
        }
    }
private:
    Event::SlotContainer container;
};

只要所有的订阅者继承这个类即可。

如果需要一个严格意义上的订阅者,我们似乎又没有为订阅者添加一个unSubscriberEvent的方法。CEGUI在这个问题上应该是直接忽略了,因为目前的Connection并不能直接拿到指定发布者的对象的引用,而只知道订阅了哪些消息而已。


这里写图片描述

像上面“订阅者1”一样,他居然不知道“事件A”(Connection)是谁的。。。。

我目前把CEGUI的消息发布这一块的代码剥离出来了。


http://git.oschina.net/ChildCoding/EventDriver git地址

转载请注明:CodingBlog » CEGUI订阅者模式

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情