经典的一种观察者模式实现

为你的类class Target设计一个观察者基类class Observer,同时设计一个观察者容器:

 

typedef std::list<Observer*> OBSERVER_LIST;

 

再为Observer设计一系列的虚函数,表示事件处理函数,在某一事件发生时,对容器内的所有观察者调用一次该处理函数。

 

如果在Lua里就会更简单,lua的函数也是一种值,通常函数名其实就是该值的一个字符串key,类似观察者模式,可以用通用的方法去做,类似Windows消息处理,可是会更简单。

 

为每一种事件起一个名字,放在一个事件容器里,key是事件名,value是一个表,表里就是所有的观察者事件处理函数

 

[ 事件, 事件处理容器 ]

 

当事件发生时,只要把对应所有观察者的处理函数全部调一遍就ok了。

 

这里会隐含一个bug,通常注册事件,和删除事件会在运行时做(Lua基本上没有非运行时的概念),所以有可能在一个事件处理循环中,调到删除它本身事件的操作(或者前一个,或者下一个),程序的正确性取决于lua的实现,通常会崩溃。(解决这个问题的一个做法是引用计数,对深一层的调用对资源进行引用计数加一,这样能使得资源的真正释放时机会在最外层调用中)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值