状态模式(State)
3.9.1. 目的
状态模式可以基于一个对象的同种事务而封装出不同的行为。它提供一种简洁的方式使得对象在运行时可以改变自身行为,而不必借助单一庞大的条件判断语句。
3.9.2. UML 类图

3.9.3. 代码
你可以在 GitHub 上找到这些代码
ContextOrder.php
<?php
namespace DesignPatterns\Behavioral\State;
class ContextOrder extends StateOrder
{
    public function getState():StateOrder
    {
        return static::$state;
    }
    public function setState(StateOrder $state)
    {
        static::$state = $state;
    }
    public function done()
    {
        static::$state->done();
    }
    public function getStatus(): string
    {
        return static::$state->getStatus();
    }
}
StateOrder.php
<?php
namespace DesignPatterns\Behavioral\State;
abstract class StateOrder
{
    /**
     * @var array
     */
    private $details;
    /**
     * @var StateOrder $state
     */
    protected static $state;
    /**
     * @return mixed
     */
    abstract protected function done();
    protected function setStatus(string $status)
    {
        $this->details['status'] = $status;
        $this->details['updatedTime'] = time();
    }
    protected function getStatus(): string
    {
        return $this->details['status'];
    }
}
ShippingOrder.php
<?php
namespace DesignPatterns\Behavioral\State;
class ShippingOrder extends StateOrder
{
    public function __construct()
    {
        $this->setStatus('shipping');
    }
    protected function done()
    {
        $this->setStatus('completed');
    }
}
CreateOrder.php
<?php
namespace DesignPatterns\Behavioral\State;
class CreateOrder extends StateOrder
{
    public function __construct()
    {
        $this->setStatus('created');
    }
    protected function done()
    {
        static::$state = new ShippingOrder();
    }
}
3.9.4. 测试
Tests/StateTest.php
<?php
namespace DesignPatterns\Behavioral\State\Tests;
use DesignPatterns\Behavioral\State\ContextOrder;
use DesignPatterns\Behavioral\State\CreateOrder;
use DesignPatterns\Behavioral\State\ShippingOrder;
use PHPUnit\Framework\TestCase;
class StateTest extends TestCase
{
    public function testCanShipCreatedOrder()
    {
        $order = new CreateOrder();
        $contextOrder = new ContextOrder();
        $contextOrder->setState($order);
        $contextOrder->done();
        $this->assertEquals('shipping', $contextOrder->getStatus());
    }
    public function testCanCompleteShippedOrder()
    {
        $order = new ShippingOrder();
        $contextOrder = new ContextOrder();
        $contextOrder->setState($order);
        $contextOrder->done();
        $this->assertEquals('completed', $contextOrder->getStatus());
    }
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
 
           PHP 设计模式全集
PHP 设计模式全集 
         
         
         
         
             
             关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: