天天看點

狀态模式 狀态模式

标簽 : Java與設計模式

狀态模式: 允許一個對象在其内部狀态改變時改變其行為, 其對象看起來像是改變了其類. 其目的是: 解決系統中複雜對象的狀态流轉以及不同狀态下的行為封裝問題.
案例: 問題跟蹤(Bug狀态流轉): 建立(New) -> 打開(Open) -> 解決(Fixed) -> 關閉(Closed) … 且每種狀态都會對應複雜業務的處理邏輯(如通知相應開發/測試人員、郵件/短信提醒、報表記錄等等), 下面我們就以這個場景來讨論狀态模式的實作:

狀态模式-Bug流轉:

抽象狀态: 定義一個接口封裝與 Context的一個特定狀态 相關的行為:

具體狀态: 每一個子類實作一個與 Context的某一個特定狀态相關的具體行為 :

定義客戶感興趣的接口

維護一個ConcreteState子類執行個體 -目前狀态.

Client

前面介紹的狀态流轉需要由Client推動(Client調用Context的<code>request()</code>), 還有其他幾種推動方式. 如<code>State</code>自動流轉: 每個<code>State</code>處理結束, 自動進入下一狀态的處理環節(在State内部調用Context的<code>request()</code>):
将與特定狀态相關的行為局部化, 并将不同狀态的行為分隔開: 将特定的狀态相關的行為都放入一個對象中: 由于所有與狀态相關的代碼都存在于某ConcreteState中, 是以通過定義新的子類可以很容易地增加新的狀态和轉換. 可以将狀态轉移邏輯分布到State之間, 将每一個狀态轉換和動作封裝到一個類中, 就把着眼點從執行狀态提高到整個對象的狀态, 這将使代碼結構化并使意圖更加清晰,消除龐大的條件分支語句. 狀态轉換顯式化: 當一個對象僅以内部資料值來定義目前狀态時, 其狀态僅表現為一些變量的指派, 這不夠明确. 為不同的狀态引入獨立的對象使得轉換變得更加明确(類原子化).

場景:

當一個對象的行為取決于它的狀态, 并且它必須在運作時刻根據狀态改變它的行為;

一個操作中含有龐大的條件分支語句, 且這些分支依賴于該對象的狀态, 這個狀态通常用一個/多個枚舉常量表示:

OA系統請求狀态流轉

銀行系統資金狀态流轉

線程對象狀态切換

TCP連接配接狀态流轉

State模式将每一個條件分支放入一個獨立的類中. 這使得可以根據對象自身的情況将對象的狀态作為一個對象, 這一對象可以不依賴于其他對象而獨立變化.

<dl></dl>

<dt>參考:</dt>

<dd></dd>

繼續閱讀