为你的类class Target设计一个观察者基类class Observer,同时设计一个观察者容器:
typedef std::list<Observer*> OBSERVER_LIST;
再为Observer设计一系列的虚函数,表示事件处理函数,在某一事件发生时,对容器内的所有观察者调用一次该处理函数。
如果在Lua里就会更简单,lua的函数也是一种值,通常函数名其实就是该值的一个字符串key,类似观察者模式,可以用通用的方法去做,类似Windows消息处理,可是会更简单。
为每一种事件起一个名字,放在一个事件容器里,key是事件名,value是一个表,表里就是所有的观察者事件处理函数
[ 事件, 事件处理容器 ]
当事件发生时,只要把对应所有观察者的处理函数全部调一遍就ok了。
这里会隐含一个bug,通常注册事件,和删除事件会在运行时做(Lua基本上没有非运行时的概念),所以有可能在一个事件处理循环中,调到删除它本身事件的操作(或者前一个,或者下一个),程序的正确性取决于lua的实现,通常会崩溃。(解决这个问题的一个做法是引用计数,对深一层的调用对资源进行引用计数加一,这样能使得资源的真正释放时机会在最外层调用中)