加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang实现简单好用的EventDispatcher

发布时间:2020-12-16 18:04:38 所属栏目:大数据 来源:网络整理
导读:events源代码 package ax_eventsimport "fmt"// 事件类型基类type Event struct { //事件触发实例 Target IEventDispatcher //事件类型 Type string //事件携带数据源 Object interface{}}// 事件调度器基类type EventDispatcher struct { savers []*EventSa

events源代码

package ax_events

import "fmt"

// 事件类型基类
type Event struct {
    //事件触发实例
    Target IEventDispatcher
    //事件类型
    Type   string
    //事件携带数据源
    Object interface{}
}

// 事件调度器基类
type EventDispatcher struct {
    savers []*EventSaver
}

// 事件调度器中存放的单元
type EventSaver struct {
    Type      string
    Listeners []*EventListener
}

// 监听器
type EventListener struct {
    Handler EventHandler
}

// 监听器函数
type EventHandler func(event Event)

// 事件调度接口
type IEventDispatcher interface {
    //事件监听
    AddEventListener(eventType string,listener *EventListener)
    //移除事件监听
    RemoveEventListener(eventType string,listener *EventListener) bool
    //是否包含事件
    HasEventListener(eventType string) bool
    //事件派发
    DispatchEvent(event Event) bool
}

// 创建事件派发器
func NewEventDispatcher() *EventDispatcher {
    return new(EventDispatcher)
}

// 创建监听器
func NewEventListener(h EventHandler) *EventListener {
    l := new(EventListener)
    l.Handler = h
    return l
}

// 创建事件
func NewEvent(eventType string,object interface{}) Event {
    e := Event{Type:eventType,Object:object}
    return e
}

// 克隆事件
func (this *Event)Clone() *Event {
    e := new(Event)
    e.Type = this.Type
    e.Target = e.Target
    return e
}

func (this *Event)ToString() string {
    return fmt.Sprintf("Event Type %v",this.Type)
}

// 事件调度器添加事件
func (this *EventDispatcher)AddEventListener(eventType string,listener *EventListener) {
    for _,saver := range this.savers {
        if saver.Type == eventType {
            saver.Listeners = append(saver.Listeners,listener)
            return
        }
    }

    saver := &EventSaver{Type:eventType,Listeners:[]*EventListener{listener}}
    this.savers = append(this.savers,saver)
}

// 事件调度器移除某个监听
func (this *EventDispatcher)RemoveEventListener(eventType string,listener *EventListener) bool {
    for _,saver := range this.savers {
        if saver.Type == eventType {
            for i,l := range saver.Listeners {
                if listener == l {
                    saver.Listeners = append(saver.Listeners[:i],saver.Listeners[i + 1:]...)
                    return true
                }
            }
        }
    }
    return false
}

// 事件调度器是否包含某个类型的监听
func (this *EventDispatcher)HasEventListener(eventType string) bool {
    for _,saver := range this.savers {
        if saver.Type == eventType {
            return true
        }
    }
    return false
}

// 事件调度器派发事件
func (this *EventDispatcher)DispatchEvent(event Event) bool {
    for _,saver := range this.savers {
        if saver.Type == event.Type {
            for _,listener := range saver.Listeners {
                event.Target = this
                listener.Handler(event)
            }
            return true
        }
    }
    return false
}

events中包含几个核心类:
Event
EventDispatcher
EventListener
EventHandler
EventSaver
接口
IEventDispatcher
使用例子如下:

package main

import (
    "fmt"
    e "alex/ax_events"
    "time"
)

const HELLO_WORLD = "helloWorld"

func main() {
    dispatcher := e.NewEventDispatcher()
    listener := e.NewEventListener(myEventListener)
    dispatcher.AddEventListener(HELLO_WORLD,listener)

    time.Sleep(time.Second * 2)
    //dispatcher.RemoveEventListener(HELLO_WORLD,listener)

    dispatcher.DispatchEvent(e.NewEvent(HELLO_WORLD,nil))
}

func myEventListener(event e.Event) {
    fmt.Println(event.Type,event.Object,event.Target)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读