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