這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
廢話不說。上代碼:
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)
}