Golang實現簡單好用的EventDispatcher

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

events原始碼

package ax_eventsimport "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 mainimport (    "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)}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.