小A:“如何使用狀態模式?”
大B:“狀態模式可以允許客戶端改變狀態的轉換行為,而狀態機則是能夠自動改變狀態,狀態機是一個比較獨立的而且複雜的機製,具體可參考一個狀態機開源項目:狀態模式在工作流或遊戲等各種係統中有大量使用,甚至是這些係統的核心功能設計,例如政府OA中,一個批文的狀態有多種:未辦;正在辦理;正在批示;正在審核;已經完成等各種狀態,使用狀態機可以封裝這個狀態的變化規則,從而達到擴充狀態時,不必涉及到狀態的使用者。在網絡遊戲中,一個遊戲活動存在開始;開玩;正在玩;輸贏等各種狀態,使用狀態模式就可以實現遊戲狀態的總控,而遊戲狀態決定了遊戲的各個方麵,使用狀態模式可以對整個遊戲架構功能實現起到決定的主導作用。State需要兩種類型實體參與:1、statemanager狀態管理器,就是開關,如上麵例子的Context實際就是一個statemanager在statemanager中有對狀態的切換動作。2、用抽象類或接口實現的父類,不同狀態就是繼承這個父類的不同子類。”
以上麵的Context為例。我們要修改它,建立兩個類型的實體。
第一步:
首先建立一個父類:
父類中的方法要對應statemanager中的開關行為,在statemanager中這個例子就是Context中,有兩個開關動作push推和pull拉。那麼在狀態父類中就要有具體處理這兩個動作:handlepushhandlepull;同時還需要一個獲取push或pull結果的方法getcolor。
下麵是具體子類的實現:
//根據push方法“如果是blue狀態的切換到green”;
//根據pull方法“如果是blue狀態的切換到red”;
同樣其他狀態的子類實現如blue一樣。
第二步:
要重新改寫Statemanager也就是本例的Context:
//setState是用來改變state的狀態使用setState實現狀態的切換
//狀態的切換的細節部分,在本例中是顏色的變化,已經封裝在子類的handlepush中實現,這裏無需關心
//因為sample要使用state中的一個切換結果,使用getColor
至此,我們也就實現了State的refactorying過程。
以上隻是相當簡單的一個實例,在實際應用中,handlepush或handelpull的處理是複雜的。
(本章完)