有沒有想過,當你在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 的新影片,或者那雙你關注已久的鞋子終於降價了!在軟體設計中,這可以幫我們保持編碼的整潔,並且易於擴展。下次當你得到某個通知,或許你會想到這背後的觀察者模式呢!