天天看點

通俗易懂設計模式解析——狀态模式

  今天我們講的是狀态模式【State Pattern】、這個名字咋一看不好了解,但是仔細一想還是比較容易的。狀态模式重點關注的是狀态。狀态又牽扯着什麼呢?房屋的狀态暫且可以分為出租、簽訂合同、退房。那麼出租對應的是什麼呢?出租狀态代表可以租房。可以租房是一個行為了。是以不難了解的是狀态模式關注的是狀态的改變與行為的變化。

  在軟體系統中,經常狀态的改變影響着行為的變化。例如房屋狀态是出租既可以租房、出售既可以買賣房、不租售意味不可操作。那麼如何避免對象操作和狀态轉換之間出現緊耦合呢?狀态模式将每種狀态對應的行為抽象出來成為單獨新的對象,這樣狀态的變化不再依賴于對象内部的行為正解決了此問題。

  允許對象在内部狀态發生改變時改變它的行為,對象看起來好像修改了它的類。

通俗易懂設計模式解析——狀态模式

我們看下案例圖中主要三個部分:

環境角色:包含保留了一個具體狀态的執行個體、給出目前狀态及調用方法。

抽象狀态:定義接口、封裝一個狀态相對應的行為方法。

具體狀态:實作具體狀态對應的的具體對應行為。

我們繼續看這個房屋的案例,針對房屋我們整理這麼一個案例,租房然後簽訂合同。合同半年内退房無押金。租房時間達到半年退房可得押金。我們看下代碼實作吧:

  在上面的代碼運作之後房屋一的狀态在其對象内部發送了改變,進而行為也發送了變化。剛開始的正在出租改變成了簽訂合同出租之後。行為變化也從簽訂合同轉變成了退房操作。 

通俗易懂設計模式解析——狀态模式

1、行為随着狀态改變而改變的場景。

2、條件或分支語句的替代者。

1、封裝了狀态及行為的轉換規則。

2、在編寫錢枚舉出可能的狀态,确定狀态的種類。

3、友善狀态的增加。隻需要改變狀态即可改變對象的行為。擴充性好。

4、可以多個環境一起共享一個狀态對象,減少了對象個數。

1、狀态模式會增加系統類和對象的個數

2、對開閉原則不友好。增加狀态需要對那些負責狀态轉換的代碼進行修改。否則的話無法轉換到最新的狀态。

3、狀态模式的結構和實作都比較複雜,使用不當容易造成代碼混亂及難了解。

  狀态模式到這裡介紹完了,狀态模式模式注重的狀态在内部的改變自動改變其行為。對象看起來好像改變了它的類一樣。抓住重點實作。第一個是狀态的變化。第二個是狀态變化引起的行為變化。第三個是在狀态内部改變的。把狀态的轉換邏輯和狀态對象放在一起。繼而替換一個龐大的語句條件。 

繼續閱讀