Lua监听事件观察者模式

监听部分

-- 程序运行完成时一定要有输出语句,本工具才能正确展示运行结果。
Event = {}

function Event:new(event)
	local event = event or {}
	setmetatable(event, self)
	self.__index = self
	return event
end

function Event:Instance()
	if not self.instance then
		self.instance = self:new()
		self._listeners = {}
	end
	return self.instance
end

function Event:addEventListener(listener, eventType, callback)
	-- assert(eventType)
	-- assert(type(listener) == 'table')
	-- assert(type(eventType) == 'string')
	-- assert(type(callback) == 'function')
	print(listener, eventType, callback)
	if not self._listeners[eventType] then
		self._listeners[eventType] = {}
	end
	self._listeners[eventType][listener] = callback
end

function Event:delEventListener(listener, evenType)
	if not evenType then
		for ev, es in pairs(self._listeners) do
			es[listener] = nil
		end
	else
		local es = self._listeners[evenType]
		if es then
			es[listener] = nil
		end
	end
end

function Event:dispatchEvent(eventType, ...)
	if not self._listeners then return end
	local callbacks = self._listeners[eventType]
	if callbacks then
		for listener, func in pairs(callbacks) do
			listener[func](listener, ...)
		end
	end
end


调用部分

无参数

A = {}

function A:a()
	local event = Event:Instance()
	event:addEventListener(self, 'eat', 'getName')	
end

function A:getName()
	print("aaaaaaaaaaaaaaaaaaaaaaaaa")
end

function A:set()
	local event = Event:Instance()
	event:dispatchEvent('eat')
end

A:a()--创建监听
A:set()--分发事件


输出:aaaaaaaaaaaaaaaaaaaaaaaaa

有参数

A = {}

function A:a()
	local event = Event:Instance()
	event:addEventListener(self, 'eat', 'getName')	
end

function A:getName(obj)
	print(obj)
end

function A:set(obj)
	local event = Event:Instance()
	event:dispatchEvent('eat',obj)
end

A:a()--创建监听
A:set("11111")--分发事件


输出:11111

猜你喜欢

转载自blog.csdn.net/cuijiahao/article/details/126308658
今日推荐