觀察者模式
最近在看設計模式,正好也在看 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()
}