用GO實現的改進的觀察者模式

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

廢話不說。上代碼:


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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.