CEGUI订阅者模式

来源:互联网 发布:西安域名备案代理 编辑:程序博客网 时间:2024/06/15 01:41

我一直在用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地址

阅读全文
0 0