前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go笔记:事件机制与观察者模式

go笔记:事件机制与观察者模式

作者头像
超级大猪
发布2019-11-22 11:42:28
1.1K0
发布2019-11-22 11:42:28
举报
文章被收录于专栏:大猪的笔记大猪的笔记

模拟C#的eventHandler。乖乖就是真开心的意思。。。

示例:猫和老鼠(猫捉老鼠,系统触发警告事件通知老鼠快跑)

代码语言:javascript
复制
package main

import (
    . "eventHandler"
    "fmt"
)

func main() {
    handler := NewEventHander()
    defer handler.Release()

    yzh := NewMouse("yzh")
    zhh := NewMouse("zhh")

    handler.AddListener("yzh", yzh.Shout)
    handler.AddListener("zhh", zhh.Shout)

    Alert()

    args := NewEventArgs()
    args.Param["info"] = "快跑!"

    handler.OnEvent(args)

    fmt.Println("yzh总被大猫吃掉")
    Alert()
    handler.RemoveListener("yzh")
    handler.OnEvent(args)
}

func Alert() {
    fmt.Println("大猫出来了!!")
}

func NewMouse(name string) *Mouse {
    fmt.Println("小老鼠", name, "出来了。")
    return &Mouse{name}
}

type Mouse struct {
    Name string
}

func (mouse *Mouse) Shout(args *EventArgs) {
    if v, ok := args.Param["info"]; ok {
        fmt.Println(mouse.Name, v.(string))
    }
}

eventHandler库:

代码语言:javascript
复制
package eventHandler

import (
    "fmt"
)

func NewEventHander() *EventHandler {
    return &EventHandler{make(map[string]chan *EventArgs)}
}

func NewEventArgs() *EventArgs {
    return &EventArgs{make(map[string]interface{})}
}

type EventHandler struct {
    listeners map[string]chan *EventArgs
}

type EventArgs struct {
    Param map[string]interface{}
}

func (handler *EventHandler) AddListener(callbackName string, callback func(*EventArgs)) {
    if _, ok := handler.listeners[callbackName]; !ok {
        ch := make(chan *EventArgs)

        handler.listeners[callbackName] = ch
        go func() {
            for {
                event := <-ch
                if event == nil {
                    break
                }
                (callback)(event)
            }
        }()
    }
}

func (handler *EventHandler) RemoveListener(callbackName string) (listenersLength int) {
    if _, ok := handler.listeners[callbackName]; ok {
        handler.listeners[callbackName] <- nil
        delete(handler.listeners, callbackName)
    }
    return len(handler.listeners)
}

func (handler *EventHandler) OnEvent(event *EventArgs) {
    for _, v := range handler.listeners {
        v <- event
    }
}

func (handler *EventHandler) Release() {
    for _, v := range handler.listeners {
        v <- nil
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-09-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档