狀態 (State)

★★★★Studied

FromDesign Patterns (GoF)大話設計模式

📚 From the Books

狀態 (State)ConceptBehavioral

讓物件的行為隨內部狀態改變,看起來像「換了一個類別」。核心是把每個狀態抽成獨立物件、各自實作行為,並由狀態自己決定下一個狀態,取代散落各處依狀態判斷的 if/else

🧠 When to Use

TIP

訊號:同一個方法的行為要看「目前處在哪個狀態」而不同,而你正在每個方法裡重複寫 when(state),加一個狀態就得改好幾處。

⚖️ Structure & Variants

經典版 — 每個狀態一個類別,狀態自己決定轉移
interface State { fun next(m: TrafficLight) }

object Red : State {
    override fun next(m: TrafficLight) { m.state = Green }   // ← 狀態自己轉移
}
object Green : State {
    override fun next(m: TrafficLight) { m.state = Yellow }
}
object Yellow : State {
    override fun next(m: TrafficLight) { m.state = Red }
}

class TrafficLight {
    var state: State = Red
    fun tick() = state.next(this)
}

val light = TrafficLight()
light.tick()    // Red -> Green
  • TrafficLight 不含任何 if;轉移規則內聚在各狀態物件裡。
用 sealed class + when 收斂(Kotlin 風)
  • 狀態數量固定、轉移簡單時,用 sealed class 列舉狀態、在一處 when 窮舉轉移,編譯器幫你檢查有沒有漏接,常比一堆類別更好維護。
和 Strategy 的差別(結構同形)
  • Strategy:由外部選定演算法,物件存活期內通常不自己換。
  • State:狀態物件自己決定下一個狀態,行為隨內部流轉而變。
  • 結構幾乎一樣,差在「誰決定切換、切換語意是不是狀態機」。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading