Go語言事件系統

package main

import "fmt"

func main() {

   // 實例化一個角色
   a := new(Actor)

   // 註冊名爲OnSkill的回調
   RegisterEvent("OnSkill", a.OnEvent)

   // 再次在OnSkill上註冊全局事件
   RegisterEvent("OnSkill", GlobalEvent)

   // 調用事件,所有註冊的同名函數都會被調用
   CallEvent("OnSkill", 100)

}

// 聲明角色的結構體
type Actor struct {
}

// 爲角色添加一個事件處理函數
func (a *Actor) OnEvent(param interface{}) {

   fmt.Println("actor event:", param)
}

// 全局事件
func GlobalEvent(param interface{}) {

   fmt.Println("global event:", param)
}

// 實例化一個通過字符串映射函數切片的map
var eventByName = make(map[string][]func(interface{}))

// 註冊事件,提供事件名和回調函數
func RegisterEvent(name string, callback func(interface{})) {

   // 通過名字查找事件列表
   list := eventByName[name]

   // 在列表切片中添加函數
   list = append(list, callback)

   // 將修改的事件列表切片保存回去
   eventByName[name] = list
}

// 調用事件
func CallEvent(name string, param interface{}) {

   // 通過名字找到事件列表
   list := eventByName[name]

   // 遍歷這個事件的所有回調
   for _, callback := range list {

      // 傳入參數調用回調
      callback(param)
   }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章