天天看點

22、Python與設計模式--狀态模式一、電梯控制器二、狀态模式三、狀态模式的優點和應用場景四、狀态模式的缺點

電梯在我們周邊随處可見,電梯的控制邏輯中心是由電梯控制器實作的。電梯的控制邏輯,即使簡單點設計,把狀态分成開門狀态,停止狀态和運作狀态,操作分成開門、關門、運作、停止,那流程也是很複雜的。首先,開門狀态不能開門、運作、停止;停止狀态不能關門,停止;運作狀态不能開門、關門、運作。要用一個一個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,被禁止,然後,關門、運作、停止。

狀态模式的定義如下:當一個對象内在狀态改變時允許其改變行為,這個對象看起來像改變了其類。

22、Python與設計模式--狀态模式一、電梯控制器二、狀态模式三、狀态模式的優點和應用場景四、狀态模式的缺點

優點:

1、狀态模式的優點是結構清晰,相比于if…else…簡約了不少;

2、封裝性好,外部調用不必知道内部實作細節。

應用場景:

1、行為狀态改變的場景。這點在各種控制器中非常常見,同時,邏輯結構為狀态轉移圖的場景中都非常适用。

1、在狀态比較多時,子類也會非常多,不便于管理。