1 --EventDispatcher.lua 2 local EventDispatcher = {} 3 EventDispatcher.__index = EventDispatcher 4 function EventDispatcher:new() 5 local store = nil 6 7 return function(self) 8 if store then return store end 9 local o = {} 10 setmetatable(o, self) 11 self.__index = self 12 store = o 13 self.m_listeners = {} 14 return o 15 end 16 end 17 18 EventDispatcher.instance = EventDispatcher:new() 19 20 function EventDispatcher:addEvent(name,listener) 21 -- 先看看事件是否存在 22 local index = 1 23 if self.m_listeners[name] == nil then 24 self.m_listeners[name] = {} 25 else 26 local existIndex = self:getEventIndex(name,listener) 27 if existIndex ~= -1 then 28 return 29 end 30 index = #self.m_listeners[name] + 1 31 end 32 --cclog("EventDispatcher:addEvent %s,index = %d",name,index) 33 self.m_listeners[name][index] = listener 34 end 35 36 function EventDispatcher:removeEvent(name,listener) 37 if self.m_listeners[name] == nil then 38 return 39 end 40 local existIndex = self:getEventIndex(name,listener) 41 if existIndex == -1 then return end 42 table.remove(self.m_listeners[name],existIndex) 43 end 44 45 function EventDispatcher:dispatchEvent(name,...) 46 if self.m_listeners[name] == nil then 47 return 48 end 49 for k,v in pairs(self.m_listeners[name]) do 50 v(...) 51 end 52 end 53 54 function EventDispatcher:getEventIndex(name,listener) 55 if self.m_listeners[name] == nil then 56 return -1 57 end 58 for i=1,#self.m_listeners[name] do 59 if self.m_listeners[name][i] == listener then 60 return i 61 end 62 end 63 return -1 64 end 65 66 return EventDispatcher