Golang - Design Pattern #8: 狀態模式 (State)

閱讀時間約 6 分鐘
raw-image
狀態模式:就像你的心情變化!

大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?


深入探索

狀態模式允許一個物件在其內部狀態改變時改變其行為。物件似乎改變了它的類別。換句話說,狀態模式能幫助你避免過多的 if-elseswitch 語句。


Go Go Go

🎵 音樂播放器

想像你正在開發一個簡單的音樂播放器,它有三種狀態:播放暫停停止。每當用戶按下按鈕,播放器的狀態就會改變。
package main

import "fmt"

// State 介面定義了處理狀態的方法。
type State interface {
Handle(context *MusicPlayerContext)
}

// PlayState 表示播放狀態。
type PlayState struct{}

func (p *PlayState) Handle(context *MusicPlayerContext) {
fmt.Println("正在播放音樂")
context.SetState(&PauseState{})
}

// PauseState 表示暫停狀態。
type PauseState struct{}

func (p *PauseState) Handle(context *MusicPlayerContext) {
fmt.Println("音樂已暫停")
context.SetState(&StopState{})
}

// StopState 表示停止狀態。
type StopState struct{}

func (s *StopState) Handle(context *MusicPlayerContext) {
fmt.Println("音樂已停止")
context.SetState(&PlayState{})
}

// MusicPlayerContext 包含當前的狀態。
type MusicPlayerContext struct {
state State
}

func (m *MusicPlayerContext) SetState(state State) {
m.state = state
}

func (m *MusicPlayerContext) PressPlayButton() {
m.state.Handle(m)
}

func main() {
player := &MusicPlayerContext{state: &StopState{}}
player.PressPlayButton() // 音樂已停止
player.PressPlayButton() // 正在播放音樂
player.PressPlayButton() // 音樂已暫停
}

透過上述例子,你可以看到播放器是如何在不同狀態之間轉換的。


🎮 遊戲角色

如果你正在開發一個遊戲,角色可能會有:正常受傷死亡 等狀態。在受傷狀態下,角色的移動速度可能會減慢;在死亡狀態下,角色可能不能移動。通過使用狀態模式,你可以輕鬆管理角色在不同狀態下的行為。
package main

import "fmt"

// CharacterState 是一個介面,定義了不同角色狀態的 Move 方法。
type CharacterState interface {
Move()
}

// HealthyState 表示角色健康狀態。
type HealthyState struct{}

func (h *HealthyState) Move() {
fmt.Println("角色快速移動!") // 角色快速移動!
}

// InjuredState 表示角色受傷狀態。
type InjuredState struct{}

func (i *InjuredState) Move() {
fmt.Println("角色移動得有點慢...") // 角色移動得有點慢...
}

// DeadState 表示角色死亡狀態。
type DeadState struct{}

func (d *DeadState) Move() {
fmt.Println("角色不能移動,他已經...RIP。") // 角色不能移動,他已經...RIP。
}

// GameCharacter 表示帶有特定狀態的遊戲角色。
type GameCharacter struct {
state CharacterState
}

func (g *GameCharacter) SetState(state CharacterState) {
g.state = state
}

func (g *GameCharacter) Move() {
g.state.Move()
}

func main() {
hero := &GameCharacter{state: &HealthyState{}}
hero.Move() // 角色快速移動!

hero.SetState(&InjuredState{})
hero.Move() // 角色移動得有點慢...

hero.SetState(&DeadState{})
hero.Move() // 角色不能移動,他已經...RIP。
}

從上面的例子你可以看到,每當角色狀態改變,他的移動方式也隨之改變。這不就像遊戲裡的角色真的受傷或死掉嗎?


總結一下

狀態模式不只讓代碼更整潔,還能讓你更容易模擬現實生活的情境。它幫助我們整理代碼,避免過多的條件判斷,並保持我們的代碼整潔。所以,下次當你的物件有很多可能的「狀態」時,你知道該怎麼辦了吧!😆


avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得小時候玩的樂高嗎?一塊一塊的組裝起來,每塊都增加了更多的功能。裝飾者模式也是這樣,給你一種疊加功能的感覺,但卻不會搞亂原有的設計。
你有沒有用過智能家居遙控器,按一下開燈、再按一下關電視?那麼,你可能已經用過命令模式了!
有沒有想過,當你在YouTube訂閱了一個頻道,每當有新影片,你就會得到通知呢?這背後就是觀察者模式在運作!
當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得小時候玩的樂高嗎?一塊一塊的組裝起來,每塊都增加了更多的功能。裝飾者模式也是這樣,給你一種疊加功能的感覺,但卻不會搞亂原有的設計。
你有沒有用過智能家居遙控器,按一下開燈、再按一下關電視?那麼,你可能已經用過命令模式了!
有沒有想過,當你在YouTube訂閱了一個頻道,每當有新影片,你就會得到通知呢?這背後就是觀察者模式在運作!
當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
你有沒有注意到,有些應用程式的行為會根據不同的狀態而有所不同?當你使用音樂播放器時,按下「播放」按鈕,播放器會開始播放音樂;當音樂處於暫停狀態時,按下同一個按鈕卻是繼續播放,而不是重頭播放。這就是狀態模式的典型應用。每一個狀態都對應著不同的行為,而這些行為隨著狀態的變化而變化。 什麼是狀態模式
不知何時開始 內在常駐某種緊繃的模式 應該是經由長期累積起來的 就連休息時也一樣 但我在 此刻 能做到 在當下有意識地更放鬆 或許挑個純海浪聲一起 https://www.youtube.com/watch?v=NvImGW1kIwY很專注地讓自己當下 更放鬆  專注到緩慢而微微放
情緒不穩的時候 可以... ●書寫倒垃圾 打開電腦或拿出筆,把心中想法都寫出來。 ●正念 去練習禪修或正念,看到情緒,發現情緒不是你,你不是情緒。 ●聽音樂畫畫 聽有感覺的音樂,把情緒畫出來。 ●自己一個人亂語靜心 ●練習自我慈悲四步驟 如果是悲傷... ●可以祈
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
瞭解情緒建構的概念,轉變對情緒的感知與解讀方式,自主地思考內在感受和情緒建構,共同探索情緒培伴Playback技巧。
Thumbnail
我是一個超級愛聽音樂的孩子。 音樂幾乎是我療癒、平靜心情的一個方式,以一個藝術創意型人來說,只要一個人的空間就會播放音樂,而音樂類型偏日韓流行類,在冥想、靜心、睡覺才會使用心靈音樂。 所以為什麼要試隨機模式? 我在最近深深感受到,隨機播放模式,也是種另類的「宇宙建議或者提醒」。
Thumbnail
昨天寫完<要一直動,才會有安定、安穩的生活>時,想到所謂的「動」、「靜」其實和表面上看到的不一樣,所以又來說一說。   「動」和「改變」可能是同一個意思,人們在動的時候是一直地在變換位置、動作或是方向的啊!   動就是改變,不能以看到的現狀來評斷它現在是在動,還是靜。   從靜止的狀態開
Thumbnail
動態(Dynamic),在音樂裡面通常指的是音樂的強弱,也可以說是音樂的高低起伏,在譜上比較常見的符號就是從 p (弱)到 f (強)。 看了幾首古典樂譜,你會發現,其實很多強弱記號都是經過作曲家精心安排的,有些曲子光是靠動態的強弱調整就可以讓整首曲子變得超好玩又充滿感情。 動態容易被忘記 我
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
你有沒有注意到,有些應用程式的行為會根據不同的狀態而有所不同?當你使用音樂播放器時,按下「播放」按鈕,播放器會開始播放音樂;當音樂處於暫停狀態時,按下同一個按鈕卻是繼續播放,而不是重頭播放。這就是狀態模式的典型應用。每一個狀態都對應著不同的行為,而這些行為隨著狀態的變化而變化。 什麼是狀態模式
不知何時開始 內在常駐某種緊繃的模式 應該是經由長期累積起來的 就連休息時也一樣 但我在 此刻 能做到 在當下有意識地更放鬆 或許挑個純海浪聲一起 https://www.youtube.com/watch?v=NvImGW1kIwY很專注地讓自己當下 更放鬆  專注到緩慢而微微放
情緒不穩的時候 可以... ●書寫倒垃圾 打開電腦或拿出筆,把心中想法都寫出來。 ●正念 去練習禪修或正念,看到情緒,發現情緒不是你,你不是情緒。 ●聽音樂畫畫 聽有感覺的音樂,把情緒畫出來。 ●自己一個人亂語靜心 ●練習自我慈悲四步驟 如果是悲傷... ●可以祈
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
瞭解情緒建構的概念,轉變對情緒的感知與解讀方式,自主地思考內在感受和情緒建構,共同探索情緒培伴Playback技巧。
Thumbnail
我是一個超級愛聽音樂的孩子。 音樂幾乎是我療癒、平靜心情的一個方式,以一個藝術創意型人來說,只要一個人的空間就會播放音樂,而音樂類型偏日韓流行類,在冥想、靜心、睡覺才會使用心靈音樂。 所以為什麼要試隨機模式? 我在最近深深感受到,隨機播放模式,也是種另類的「宇宙建議或者提醒」。
Thumbnail
昨天寫完<要一直動,才會有安定、安穩的生活>時,想到所謂的「動」、「靜」其實和表面上看到的不一樣,所以又來說一說。   「動」和「改變」可能是同一個意思,人們在動的時候是一直地在變換位置、動作或是方向的啊!   動就是改變,不能以看到的現狀來評斷它現在是在動,還是靜。   從靜止的狀態開
Thumbnail
動態(Dynamic),在音樂裡面通常指的是音樂的強弱,也可以說是音樂的高低起伏,在譜上比較常見的符號就是從 p (弱)到 f (強)。 看了幾首古典樂譜,你會發現,其實很多強弱記號都是經過作曲家精心安排的,有些曲子光是靠動態的強弱調整就可以讓整首曲子變得超好玩又充滿感情。 動態容易被忘記 我