do
--事件原型对象, 所有事件由此原型生成
Event = {}
function Event:New()
local event = {}
setmetatable(event, self)
--覆盖__index逻辑
self.__index = self
--覆盖__call逻辑
self.__call = self.Call
return event
end
--事件注册, 通过此方法将响应方法注册到事件上.
--@source:响应方法的所属对象
--@func:响应方法
function Event:Add(source, func)
table.insert(self, {source, func})
end
--内部方法, 重写了默认__call逻辑, 当event被触发调用时, 循环执行event中注册的响应方法
--@table:对象产生调用时将本身传入
--@:调用参数
function Event:Call(table, ...)
for _, item in ipairs(table) do
--item[1]就是source, item[2]就是func响应方法
--lua 5.1中无需使用unpack(arg), 直接使用...即可
item[2](item[1], unpack(arg))
end
end
------------------以下为测试用例-----------------------
--创建一个window对象, 注册按钮的点击事件
Window = {
Name = "Simonw's Window",
}
function Window:Init()
--注册事件, self即Window, 对象来源.
Button.ClickEvent:Add(self, self.Button_OnClick)
end
--响应事件方法, sender即是传来的Button对象
function Window:Button_OnClick(sender)
print(sender.Name.." Click On "..self.Name)
end
--创建一个button对象, 拥有ClickEvent这样的事件
Button = {
Name = "A Button",
--创建事件
ClickEvent = Event:New(),
}
--执行点击按钮的动作
function Button:Click()
print('Click begin')
--触发事件, self即sender参数
self.ClickEvent(self)
print('Click end')
end
--从这里执行
Window:Init()
Button:Click()
--[[
执行结果:
> dofile 'test.lua'
Click begin
A Button Click On Simonw's Window
Click end
]]
end
--事件原型对象, 所有事件由此原型生成
Event = {}
function Event:New()
local event = {}
setmetatable(event, self)
--覆盖__index逻辑
self.__index = self
--覆盖__call逻辑
self.__call = self.Call
return event
end
--事件注册, 通过此方法将响应方法注册到事件上.
--@source:响应方法的所属对象
--@func:响应方法
function Event:Add(source, func)
table.insert(self, {source, func})
end
--内部方法, 重写了默认__call逻辑, 当event被触发调用时, 循环执行event中注册的响应方法
--@table:对象产生调用时将本身传入
--@:调用参数
function Event:Call(table, ...)
for _, item in ipairs(table) do
--item[1]就是source, item[2]就是func响应方法
--lua 5.1中无需使用unpack(arg), 直接使用...即可
item[2](item[1], unpack(arg))
end
end
------------------以下为测试用例-----------------------
--创建一个window对象, 注册按钮的点击事件
Window = {
Name = "Simonw's Window",
}
function Window:Init()
--注册事件, self即Window, 对象来源.
Button.ClickEvent:Add(self, self.Button_OnClick)
end
--响应事件方法, sender即是传来的Button对象
function Window:Button_OnClick(sender)
print(sender.Name.." Click On "..self.Name)
end
--创建一个button对象, 拥有ClickEvent这样的事件
Button = {
Name = "A Button",
--创建事件
ClickEvent = Event:New(),
}
--执行点击按钮的动作
function Button:Click()
print('Click begin')
--触发事件, self即sender参数
self.ClickEvent(self)
print('Click end')
end
--从这里执行
Window:Init()
Button:Click()
--[[
执行结果:
> dofile 'test.lua'
Click begin
A Button Click On Simonw's Window
Click end
]]
end
本文介绍了一种事件驱动的编程模型,通过创建事件对象和注册响应方法,实现对象之间的松耦合交互。详细解释了事件注册、触发和响应过程,并通过一个简单的窗口和按钮实例展示了实际应用。
796

被折叠的 条评论
为什么被折叠?



