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

閱讀時間約 3 分鐘

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

31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。
哈囉!繼續我們的Go設計模式之旅,今天我們要探討的是「單例模式」。可能你已經聽過它,也可能還沒。但不用擔心,我們會從基礎解釋開始!
大家好,歡迎來到「Golang - Design Pattern」系列文!你或許已經聽過「設計模式」這四個字,或者你可能還不太清楚它在軟體開發中的角色。不管你是哪一種情況,我們都會從頭開始,循序漸進地為你解鎖Go語言在設計模式中的神奇之處。 簡介 設計模式是什麼呢?簡單地說,它就是一套「最佳
當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。
哈囉!繼續我們的Go設計模式之旅,今天我們要探討的是「單例模式」。可能你已經聽過它,也可能還沒。但不用擔心,我們會從基礎解釋開始!
大家好,歡迎來到「Golang - Design Pattern」系列文!你或許已經聽過「設計模式」這四個字,或者你可能還不太清楚它在軟體開發中的角色。不管你是哪一種情況,我們都會從頭開始,循序漸進地為你解鎖Go語言在設計模式中的神奇之處。 簡介 設計模式是什麼呢?簡單地說,它就是一套「最佳
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Web design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
Thumbnail
從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Web design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
Thumbnail
從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~