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面向對象設計模式

發佈留言