Golang实现简单好用的EventDispatcher

gofounder · · 1703 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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)
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:gofounder

查看原文:Golang实现简单好用的EventDispatcher

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1703 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传