PHP設計模式——狀態模式
狀態模式當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。狀態模式主要解決的是當控制一個對象狀態的條件運算式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。
UML類圖:
角色:
上下文環境(Work):它定義了客戶程式需要的介面並維護一個具體狀態角色的執行個體,將與狀態相關的操作委託給當前的具體對象來處理。
抽象狀態(State):定義一個介面以封裝使用上下文環境的的一個特定狀態相關的行為。
具體狀態(AmState):實現抽象狀態定義的介面。
核心代碼:
* User: Jang * Date: 2015/6/10 * Time: 10:34 *///狀態介面interface IState{ function WriteCode(Work $w);}//上午工作狀態class AmState implements IState{ public function WriteCode(Work $w) { if($w->hour<=12) { echo 目前時間:{$w->hour}點,上午工作;犯困,午休。; } else { $w->SetState(new PmState()); $w->WriteCode(); } }}//下午工作狀態class PmState implements IState{ public function WriteCode(Work $w) { if($w->hour<=17) { echo 目前時間:{$w->hour}點,下午工作狀態還不錯,繼續努力。; } else { $w->SetState(new NightState()); $w->WriteCode(); } }}//晚上工作狀態class NightState implements IState{ public function WriteCode(Work $w) { if($w->IsDone) { $w->SetState(new BreakState()); $w->WriteCode(); } else { if($w->hour<=21) { echo 目前時間:{$w->hour}點,加班哦,疲累至極。; } else { $w->SetState(new SleepState()); $w->WriteCode(); } } }}//休息狀態class BreakState implements IState{ public function WriteCode(Work $w) { echo 目前時間:{$w->hour}點,下班回家了。; }}//睡眠狀態class SleepState implements IState{ public function WriteCode(Work $w) { echo 目前時間:{$w->hour}點,不行了,睡著了。; }}//工作狀態class Work{ private $current; public function Work() { $this->current = new AmState(); } public $hour; public $isDone; public function SetState(IState $s) { $this->current = $s; } public function WriteCode() { $this->current->WriteCode($this); }}
調用用戶端測試代碼:
//-------------------------狀態模式-------------------------require_once ./State/State.php;$emergWork = new Work();$emergWork->hour = 9;$emergWork->WriteCode();$emergWork->hour = 10;$emergWork->WriteCode();$emergWork->hour = 13;$emergWork->WriteCode();$emergWork->hour=14;$emergWork->WriteCode();$emergWork->hour = 17;$emergWork->WriteCode();$emergWork->IsDone = true;$emergWork->IsDone = false;$emergWork->hour = 19;$emergWork->WriteCode();$emergWork->hour = 22;$emergWork->WriteCode();
適用情境:
1.一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為。
2.一個操作中含有龐大的多分支結構,並且這些分支決定於對象的狀態。
優點
1.狀態模式將與特定狀態相關的行為局部化,並且將不同狀態的行為分割開來。
2.所有狀態相關的代碼都存在於某個ConcereteState中,所以通過定義新的子類很容易地增加新的狀態和轉換。
3.狀態模式通過把各種狀態轉移邏輯分不到State的子類之間,來減少相互間的依賴。
缺點
導致較多的ConcreteState子類
歡迎關注我的視訊課程,地址如下,謝謝。
PHP物件導向設計模式
http://www.bkjia.com/PHPjc/1015542.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1015542.htmlTechArticlePHP設計模式——狀態模式 狀態模式當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。狀態模式主要解決的是...