Lua监听事件观察者模式

5 篇文章 0 订阅

监听部分

-- 程序运行完成时一定要有输出语句,本工具才能正确展示运行结果。
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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值