2023-08-23|閱讀時間 ‧ 約 4 分鐘

Golang - Design Pattern #4: 觀察者模式 (Observer)

觀察者模式(Observer):就像你的YouTube訂閱一樣!

有沒有想過,當你在YouTube訂閱了一個頻道,每當有新影片,你就會得到通知呢?這背後就是觀察者模式在運作!


那什麼是觀察者模式?

很簡單,觀察者模式就像是一個明星(被觀察者)和他的粉絲(觀察者)。每當明星有什麼新動態,粉絲都會第一時間知道。


實務上的例子

股票市場的分析師

想像你是一名股票市場的分析師。你關注的股票一旦價格變動,你會馬上得知,這樣你就能及時做出決策了。

電商的價格提醒

你有沒有在某些購物網站上關注過某商品,希望它降價時得到通知?這就是觀察者模式的實務運用之一!

看看程式怎麼寫

假設我們要模擬股票市場的情境。首先,我們有一群分析師等著接收股票的價格更新通知。當股票價格變動,他們都會馬上知道!

package main

import "fmt"

// Observer 接口:所有關注股票價格的分析師都要實現這個接口
type Observer interface {
Notify(stockPrice float32)
}

// StockMarket 是被觀察者,當股票價格變動時,會通知所有註冊的分析師
type StockMarket struct {
observers []Observer
stockPrice float32
}

func (s *StockMarket) Register(observer Observer) {
s.observers = append(s.observers, observer)
}

func (s *StockMarket) SetPrice(price float32) {
s.stockPrice = price
s.notifyAll()
}

func (s *StockMarket) notifyAll() {
for _, observer := range s.observers {
observer.Notify(s.stockPrice)
}
}

// Analyst 實現了 Observer 接口,代表一個股票市場的分析師
type Analyst struct {
name string
}

func (a *Analyst) Notify(stockPrice float32) {
fmt.Printf("%s 得到了新的股價:$%f\n", a.name, stockPrice)
}

func main() {
stockMarket := &StockMarket{}

alice := &Analyst{name: "Alice"}
bob := &Analyst{name: "Bob"}

stockMarket.Register(alice)
stockMarket.Register(bob)

stockMarket.SetPrice(120.0) // 當價格改變時,Alice 和 Bob 都會被通知
stockMarket.SetPrice(125.5) // 再次改變價格,Alice 和 Bob 都會得到通知
}

這段程式碼模擬了一個股票市場(StockMarket),當它的股價改變時,所有註冊過的分析師(Analyst,他們是觀察者)都會得到通知。在 main 函數中,我們模擬了股價的改變,並且觀察到註冊的分析師如何獲得通知。


總結

觀察者模式其實就是讓事情保持更新,確保你不會錯過任何東西。就像你不想錯過你最愛 YouTuber 的新影片,或者那雙你關注已久的鞋子終於降價了!在軟體設計中,這可以幫我們保持編碼的整潔,並且易於擴展。下次當你得到某個通知,或許你會想到這背後的觀察者模式呢!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.