Go 設計模式之觀察者模式

JaguarJack發表於2019-04-05

觀察者模式

最近在看設計模式,正好也在看 GO,所以之後都會用 GO 來學習基礎的設計模式。當然不會很複雜去演示某一個模式,只需要有這個概念就可以了。如果工作中生硬的去套用模式,這肯定是不可取的。模式是程式碼實踐的結果,沒有一定的程式碼量,是無法理解其之精髓。這是我一直以來的對模式的看法。當然書本的知識會讓學習更快接觸模式的思維。

觀察者模式(Observer Pattern):定義物件間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。觀察者模式又叫做釋出-訂閱(Publish/Subscribe)模式、模型-檢視(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。

觀察者模式是一種物件行為型模式。

GO 的簡單實現:

 package main

import "fmt"

type Subject interface {
    AddObserver(observer Observer)
    RemoveObserver(observer Observer)
    Notify()
}

type Observer interface {
    Update()
}

type Weather struct {
    observers []Observer
}

func(this *Weather) AddObserver(observer Observer)  {
    this.observers = append(this.observers, observer)
}

func(this *Weather) RemoveObserver(observer Observer)  {
    for i,v := range this.observers {
        if v == observer {
            this.observers = append(this.observers[:i], this.observers[i+1:]...)
        }
    }
}

func(this *Weather) Notify()  {
    for _,v :=range this.observers {
        v.Update()
    }
}

type Ob1 struct {}
func(this Ob1) Update()  {
    fmt.Println("this is Ob1")
}

type Ob2 struct {}
func(this Ob2) Update()  {
    fmt.Println("this is Ob2")
}

type Ob3 struct {}
func(this Ob3) Update()  {
    fmt.Println("this is Ob3")
}
var (
    Sub Subject
    ob1, ob2, ob3 Observer
)
func main()  {
    Sub, ob1, ob2, ob3 =  &Weather{}, Ob1{}, Ob2{},Ob3{}
    Sub.AddObserver(ob1)
    Sub.AddObserver(ob2)
    Sub.AddObserver(ob3)
    Sub.RemoveObserver(ob2)
    Sub.Notify()
}

相關文章