用GO实现的改进的观察者模式

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

废话不说。上代码:


Publisher.go:


package main

import (
    "container/list"
)

type Handler interface {//这里主要参考了Go里HTTP包的实现
    Serve(int)
}

type HandlerFunc func(args int)

func (f HandlerFunc) Serve(args int) {//是不是很熟悉的代码?
    f(args)
}

type Publish struct {
    HandlerFuncs *list.List
    Value        int
}

func NewPublisher() *Publish {
    p := new(Publish)
    p.HandlerFuncs = list.New()
    p.Value = 22
    return p
}

func (p *Publish) AddSubscriber(f HandlerFunc) {//可以添加任何方法,只要是HandlerFunc的
    p.HandlerFuncs.PushBack(f)
}

func (p *Publish) Notify(args int) {
    for f := p.HandlerFuncs.Front(); f != nil; f = f.Next() {
        f.Value.(Handler).Serve(args)//此处是我觉得比较得意的,比一般的观察者先进的地方,实现了任意函数名的调用
    }
}

Subscriber.go:


package main
import "fmt"
type Subscribe struct {
}
func (s *Subscribe) Dosome(args int) {
    fmt.Println("Dosome:", args)
}
func (s *Subscribe) Fucksome(args int) {
    fmt.Println("Fucksome", args)
}

main.go:

package main
func main() {
    publisher := NewPublisher()//不用多说了吧,代码很清楚了
    subscriber := new(Subscribe)
    publisher.AddSubscriber(HandlerFunc(subscriber.Dosome))
    publisher.AddSubscriber(HandlerFunc(subscriber.Fucksome))
    publisher.Notify(publisher.Value)
}




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

本文来自:CSDN博客

感谢作者:zha_stef

查看原文:用GO实现的改进的观察者模式

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

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