閒來無事,分享下網文
使用狀態模式來管理物件的不同狀態。在狀態模式(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 協議》,轉載必須註明作者和本文連結