分享
  1. 首页
  2. 文章

Golang实现简单好用的EventDispatcher

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

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏