狀態模式

維基百科,自由的百科全書

狀態模式是一種行為類型軟件設計模式,它可以讓物件在其內部狀態有變化時,改為其行為。這種模式有點像有限狀態機的概念。狀態模式可以被當成成一種策略模式,它能夠在調用模式介面中所定義的方法來切換策略。

計算機編程中,狀態模式用於,當同一物件基於其內部狀態而有不同行為,將其行為進行封裝。對於物件來說,這可以是一種更為簡潔方式,可以在運行時更改其行為而無需訴諸條件語句,從而提高可維護性。 [1] :395

概述[編輯]

狀態設計模式的示例 UML 類別圖和序列圖。 [2]

狀態設計模式是《設計模式:可復用物件導向軟件的基礎》所收錄的二十三個之一,本書描述了如何解決常見的設計問題。此類問題涵蓋了靈活且可重用的面向對象軟件的設計,例如易於實現、更改、測試和重用的對象。 [3]

狀態模式常用來解決兩個主要問題: [4]

  • 當對象的內部狀態改變時,它的行為也應該改變。
  • 應獨立定義特定於國家的行為。也就是說,添加新狀態不應影響現有狀態的行為。

在類別中直接為特定狀態實作行為是不夠彈性的,因為它將類別與特定行為綁定,這將使得如果要增加新的狀態或改變狀態的行為,而且這些行為是與類別獨立的,仍無法在不更改類別的情況下達到。因此,此模式描述了兩種解決方案:

  • 定義單獨的(狀態)物件,封裝每個裝態的特定的行為。即,定義一個介面(狀態)以用於執行與狀態有關的特定行為,並為每種狀態實現該接口的類別。
  • 類別不要直接實現與狀態有關的特定行為,而是將其委由當前戕態物件。

這使得類別與業於狀態的行為的實作可以獨立開來。新的狀態可以通過定義新的狀態類別來實現。類別可以在運行時,藉由改變當前狀態物件來改變其行為。

結構[編輯]

UML 中的狀態[1]

在隨附的統一建模語言(UML)類別圖中, Context 類別不直接實現特定於狀態的行為。相反, ContextState 介面以執行特定於狀態的行為 ( state.handle() ),這使得 Context 獨立於特定於狀態行為的實現方式。 ConcreteStateAConcreteStateB 類別實現 State 介面,即實現(封裝)每個狀態的特定行為。 UML序列圖 說明了運行時互動:

Context對象將特定於狀態的行為委託給不同的State對象。首先, Context 調用handle(this) 時,會是基於其當前(初始)狀態 ( ConcreteStateA ) 的行為,其會執行操作並調用 Context.setState(ConcreteStateB) 來將當前狀態更改為ConcreteStateB 。下一次, Context 再次調用 handle(this) 會是基於其當前狀態對象 ( ConcreteStateB ) ,其會執行操作,並將當前狀態更改為 ConcreteStateA

參考[編輯]

  1. ^ 1.0 1.1 Erich Gamma; Richard Helm; Ralph Johnson; John M. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. 1995. ISBN 0-201-63361-2.  引用錯誤:帶有name屬性「GOF」的<ref>標籤用不同內容定義了多次
  2. ^ The State design pattern – Structure and Collaboration. w3sDesign.com. [2017-08-12]. 
  3. ^ Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software需要免費註冊. Addison Wesley. 1994: 305ff. ISBN 0-201-63361-2. 
  4. ^ The State design pattern - Problem, Solution, and Applicability. w3sDesign.com. [2017-08-12]. (原始內容存檔於2023-11-17).