PHP設計模式——狀態模式_PHP教程

來源:互聯網
上載者:User

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設計模式——狀態模式 狀態模式當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。狀態模式主要解決的是...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.