您的位置:首页 > 编程语言 > Go语言

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

2013-08-02 12:42 218 查看
废话不说。上代码:

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)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: