CEGUI订阅者模式

我一直在用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值