--事件系统 ---------------------------------- local EventSystem = class("EventSystem") function EventSystem:ctor() self._eventBus = {} end -- _eventBus[eventName][tag] = listener function EventSystem:regEvent(eventName,listener,tag) print(eventName,tag) if type(eventName) == "string" and type(listener) == "function" then if not self._eventBus[eventName] then self._eventBus[eventName] = {} end tag = tag .. '' self._eventBus[eventName][tag] = listener printf("[[通知中心 %s 注册 %s 成功! ]]",eventName,tag) else printf("[[通知中心 %s 注册 %s 失败! ]]",tostring(eventName),tag .. '') end end function EventSystem:postEvent(eventName,data) assert(eventName,"EventSystem:postEvent eventName = nil") local target = self._eventBus[eventName] if not target then printf("[[通知中心 %s 不存在! ]]",eventName) return end local event = { eventName = eventName,tag = nil,data = data } if target then for _tag,v in pairs(target) do printf("[[通知中心 向 %s 发送 %s 成功! ]]",_tag,event.eventName) event.tag = _tag v( event ) end end end function EventSystem:unRegEvent(eventName,tag) if self._eventBus[eventName] then tag = tag .. '' self._eventBus[eventName][tag] = nil printf("[[通知中心 %s 注销 %s 成功! ]]",tag) else printf("[[通知中心 %s 注销 %s 失败! ]]",tag) end end function EventSystem:unRegEventByName(eventName) if self._eventBus[eventName] then self._eventBus[eventName] = nil printf("[[通知中心 %s 注销成功! ]]",eventName) else printf("[[通知中心 %s 注销失败! ]]",eventName) end end function EventSystem:hasEventListenerByName(eventName) local t = self._eventBus[eventName] if not t then return false end for _,__ in pairs(t) do return true end return false end function EventSystem:hasEventListener(eventName,tag) return (not self._eventBus[eventName][tag .. '']) end function EventSystem:removeAllEventListeners() self._eventBus = {} end function EventSystem:dumpAllEventListeners() print("---- EventSystem:dumpAllEventListeners() ----begin") for name,listeners in pairs(self._eventBus) do printf("-- event: %s",name) for tag,listener in pairs(listeners) do printf("-- tag: %s,listener: %s",tostring(tag),tostring(listener)) end end print("---- EventSystem:dumpAllEventListeners() ----end") end return EventSystem
[设计模式]Observer观察者模式