PHP设计模式-状态模式 State

PHP状态设计模式(State)允许一个对象在其内部状态发生改变时改变它的行为。一个对象的行为取决于一个或多个动态变化的属性,动态变化的属性叫做状态,这种对象则叫做有状态的(stateful)对象。从对象本身来说,PHP状态设计模式就是根据对象的状态不同用相同的事务流程来封装对象不同的行为。这样在项目中就可以不用写大量的条件语句,用更简洁的代码就可以实现对象不同的行为。

比如下面的PHP示例代码,根据订单状态的不同来决定如何处理订单。不同的行为具有相同的方法名,封装在不同的对象中。不过以下设计模式中许多条件下需要做更多的抛出异常的工作。

// 订单接口
interface OrderInterface
{
    public function shipOrder();

    public function completeOrder();
}
// 订单行为类 - 创建
class CreateOrder implements OrderInterface
{
    private $order;

    public function __construct(array $order)
    {
        if (empty($order)) {
            throw new \Exception('Order can not be empty!');
        }
        $this->order = $order;
    }

    public function shipOrder()
    {
        $this->order['status'] = 'shipping';
        $this->order['updatedTime'] = time();

        // 将新的订单状态保存到数据库中
        return $this->updateOrder($this->order);
    }

    public function completeOrder()
    {
        //订单创建状态不能算订单完成;
        throw new Exception('Can not complete the order which status is created!');
    }
}
// 订单行为类 - 配送
class ShippingOrder implements OrderInterface
{
    private $order;

    public function __construct(array $order)
    {
        if (empty($order)) {
            throw new Exception('Order can not be empty!');
        }
        $this->order = $order;
    }

    public function shipOrder()
    {
        //正在配送的订单不能再配送;
        throw new Exception('Can not ship the order which status is shipping!');
    }

    // 订单完成
    public function completeOrder()
    {
        $this->order['status'] = 'completed';
        $this->order['updatedTime'] = time();

        // 保存状态到数据库
        return $this->updateOrder($order);
    }
}
// 订单工厂类,根据状态不同分发到不同的行为对象中
class OrderFactory
{
    private function __construct()
    {
        throw new Exception('Can not instance the OrderFactory class!');
    }

    //根据状态的不同返回 CreateOrder 或 ShippingOrder 或不在指定状态抛出异常
    public static function getOrder($id)
    {
        $order = array(); // 从数据库读取订单信息;

        switch ($order['status']) {
            case 'created':
                return new CreateOrder($order);
            case 'shipping':
                return new ShippingOrder($order);
            default:
                throw new Exception('Order status error!');
                break;
        }
    }
}
// 订单控制器,统一的事务流程
class OrderController
{
    public function shipAction($id)
    {
        $order = OrderFactory::getOrder($id);
        try {
            $order->shipOrder();
        } catch (Exception $e) {
            //handle error!
        }
        // response to browser
    }

    public function completeAction($id)
    {
        $order = OrderFactory::getOrder($id);
        try {
            $order->completeOrder();
        } catch (Exception $e) {
            //handle error!
        }
        // response to browser
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *