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
留言分享你的想法!
avatar-img
KH Huang的沙龍
36會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
KH Huang的沙龍的其他內容
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
看更多
你可能也想看
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
訪問者模式 (Visitor Pattern) 是一種設計模式,它允許開發者將新的操作新增到現有物件結構中,而不必修改該結構的內部代碼。該模式的重點是將操作和物件結構分離,提供一個彈性的方式新增新的行為。
Thumbnail
訪問者模式 (Visitor Pattern) 是一種設計模式,它允許開發者將新的操作新增到現有物件結構中,而不必修改該結構的內部代碼。該模式的重點是將操作和物件結構分離,提供一個彈性的方式新增新的行為。
Thumbnail
在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!
Thumbnail
在軟體開發中,處理nil或空值是一個常見的挑戰。不妥當地處理它們可能導致錯誤,使得程式碼的健壯性下降。但有沒有一種方法,可以讓我們在不做特殊檢查的情況下,優雅地處理這些空值呢?答案是肯定的,那就是空物件模式 (Null Object Pattern)!
Thumbnail
創建物件有時是一個資源密集型和耗時的過程,尤其是當涉及到從資料庫或其他來源初始化物件時。原型模式就是為了解決這種問題🔧,它提供了一種方法,能夠通過複製一個已存在的物件來迅速創建新物件,而不是從頭開始。
Thumbnail
創建物件有時是一個資源密集型和耗時的過程,尤其是當涉及到從資料庫或其他來源初始化物件時。原型模式就是為了解決這種問題🔧,它提供了一種方法,能夠通過複製一個已存在的物件來迅速創建新物件,而不是從頭開始。
Thumbnail
大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!
Thumbnail
大家有沒有遇到過這種情況:當應用程式使用過多資源,如記憶體或 CPU 時,整個系統的性能直線下降?😰 不得不說,資源的有效管理在軟體開發中真的超級重要!這就是享元模式 (Flyweight Pattern) 大顯身手的時候了!
Thumbnail
你知道那種感覺嗎?當你想從複雜的家電系統中只開啟你的電視和音響,卻需要找一大堆遙控器才能完成。外觀模式(Facade)就是這樣的解決方案!它可以幫助我們簡化複雜系統的操作,提供一個單一、簡單的接口。
Thumbnail
你知道那種感覺嗎?當你想從複雜的家電系統中只開啟你的電視和音響,卻需要找一大堆遙控器才能完成。外觀模式(Facade)就是這樣的解決方案!它可以幫助我們簡化複雜系統的操作,提供一個單一、簡單的接口。
Thumbnail
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
Thumbnail
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News