• lua实现简单


    MessageManager.lua

    local messageManager = {mEventTable = {},mEventUserData = {}}

    --注册事件
    function messageManager.Add(EventName,Func,UserData)
    assert( Func )
    messageManager.mEventTable[ EventName ] = messageManager.mEventTable[ EventName ] or {}
    local Event = messageManager.mEventTable[ EventName]
    table.insert(Event,Func)
    messageManager.mEventUserData[ EventName ] = messageManager.mEventUserData[ EventName ] or {}
    local userDataTable = messageManager.mEventUserData[ EventName ]
    userDataTable[ Func ] = UserData or true
    end

    --移除事件
    function messageManager.Remove(EventName,Func)
    assert( Func )
    local Event = messageManager.mEventTable[ EventName ]
    if not Event then
    return
    end
    table.remove(Event)

    end

    --派发消息
    function messageManager.Dispatch(EventName)
    assert(EventName)
    if (messageManager.mEventTable[EventName] == nil) then
    return
    end
    local Event = messageManager.mEventTable[EventName]
    for i,Func in ipairs(Event) do
    Func(messageManager.mEventUserData[EventName][Func])
    end
    end

    return messageManager
    User.lua

    --获取事件监听器
    local MessageManager = require 'MessageManager'

    --注册事件“a”
    MessageManager.Add("a",function(a) print(a) end,""a" happened!")

    --事件“a”发生
    MessageManager.Dispatch("a")

    print("-------------------")

    --移除事件“a”
    MessageManager.Remove("a",function(a) print(a) end)

    --事件“a”发生
    MessageManager.Dispatch("a")
    运行User.lua得到的结果:

    可以看到注册事件“a”之后,当事件“a”发生之后,相对应的回调函数被事件监听器执行了;当移除事件“a之后”,事件“a”再次发生的时候,事件监听器并没有再执行事件监听者注册事件时留下的回调函数。

    这次完成的事件监听器只是个简单的demo,还有很多地方没有完善的,比如同一个事件被多个事件监听者注册的情况以及同一个事件被同一个事件监听者注册的情况,还有回调函数的参数为可变长参数的情况。

    这篇博客只是我自己在学习lua路上的一点学习记录,希望大家多多指教。
    --------------------- 

  • 相关阅读:
    Linq&Lumbda
    PS颜色模式
    WPF绑定方式
    明三杰刘健
    齐有鲍叔,郑有子皮
    朱厚照
    管子&小白
    时间
    人外有人之神箭手养繇基篇
    楚共王
  • 原文地址:https://www.cnblogs.com/ly570/p/11277971.html
Copyright © 2020-2023  润新知