電梯在我們周邊随處可見,電梯的控制邏輯中心是由電梯控制器實作的。電梯的控制邏輯,即使簡單點設計,把狀态分成開門狀态,停止狀态和運作狀态,操作分成開門、關門、運作、停止,那流程也是很複雜的。首先,開門狀态不能開門、運作、停止;停止狀态不能關門,停止;運作狀态不能開門、關門、運作。要用一個一個if…else…實作,首先代碼混亂,不易維護;二是不易擴充。至于各種設計原則什麼的……
那該如何實作?在上邊的邏輯中,每個操作僅僅是一個操作,狀态切換與操作是分離的,這也造成後來操作和狀态“互相配合”的“手忙腳亂”。如果把狀态抽象成一個類,每個狀态為一個子類,每個狀态實作什麼操作,不實作什麼操作,僅僅在這個類中具體實作就可以了。
下面我們實作這個邏輯。
先實作抽象的狀态類:
而後實作各個具體的狀态類:
為在業務中排程狀态轉移,還需要将上下文進行記錄,需要一個上下文的類。
這樣,在進行電梯的排程時,隻需要排程context就可以了。業務邏輯中如下所示:
列印如下:
stop:the door is opening...
stop:the door is opened...
open:run forbidden.
open:the door start to close...
open:the dorr is closed
stop:the lift start to run...
run:the lift start to stop...
run:the lift stopped...
由邏輯中可知,電梯先在stop狀态,然後開門,開門時運作run,被禁止,然後,關門、運作、停止。
狀态模式的定義如下:當一個對象内在狀态改變時允許其改變行為,這個對象看起來像改變了其類。

優點:
1、狀态模式的優點是結構清晰,相比于if…else…簡約了不少;
2、封裝性好,外部調用不必知道内部實作細節。
應用場景:
1、行為狀态改變的場景。這點在各種控制器中非常常見,同時,邏輯結構為狀态轉移圖的場景中都非常适用。
1、在狀态比較多時,子類也會非常多,不便于管理。