PHP 設計模式之狀態模式

rufo發表於2020-01-07

閒來無事,分享下網文

使用狀態模式來管理物件的不同狀態。在狀態模式(State Pattern)中,類的行為是基於它的狀態改變的。這種型別的設計模式屬於行為型模式。

設計訂單狀態的介面

interface OrderState
{
    function pay(); // 支付
    function shipping(); // 發貨
    function cancel();  // 取消訂單
}

已支付訂單狀態的實現

class PaidOrderState implements OrderState
{
    const STATE_CODE = 2;

    public function pay()
    {
        throw new Exception('已支付');
    }

    public function shipping(Order $order)
    {
        $order->setShipped();
    }

    public function cancel()
    {
        throw new Exception('支付後不能取消訂單');
    }
}

注:每個狀態的邏輯都封裝在了每個狀態物件裡面,使用Order的方法來改變訂單狀態。把每個狀態相關的邏輯都封裝起來,每當要新增一個新的狀態的時候只需要新增一個OrderState介面的一個實現就可以了,狀態與狀態之間互不依賴。

訂單實現

class Order
{
    // 訂單狀態
    private $orderState;

    // 支付
    public function pay()
    {
        $this->orderState->pay($this);
    }

    // 發貨
    public function shipping()
    {
        $this->orderState->shipping($this);
    }

    // 取消訂單
    public function cancel()
    {
        $this->orderState->cancel($this);
    }

    // 把訂單狀態設定成已支付狀態
    public function setPaid()
    {
        $this->orderState = new PaidOrderState();
    }

    // 把訂單狀態設定成已發貨狀態
    public function setShipped()
    {
        $this->orderState = new ShippedOrderState();
    }

    // 把訂單狀態設定成已取消狀態
    public function setCanceled()
    {
        $this->orderState = new CanceledOrderState();
    }

}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
當它本可進取時,卻故作謙卑; 在困難和容易之間,它選擇了容易; 自由軟弱,卻把它認為是生命的堅韌; 側身於生活的汙泥中,雖不甘心,卻又畏首畏尾。

相關文章