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

废话不说。上代码:


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)
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值