第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > state.php 状态模式(State)

state.php 状态模式(State)

时间:2021-01-31 12:50:59

相关推荐

state.php 状态模式(State)

3.9.1. 目的

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

3.9.2. UML 类图

3.9.3. 代码

你可以在 GitHub 上找到这些代码

ContextOrder.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

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

namespace DesignPatterns\Behavioral\State;

class ShippingOrder extends StateOrder

{

public function __construct()

{

$this->setStatus('shipping');

}

protected function done()

{

$this->setStatus('completed');

}

}

CreateOrder.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

namespace DesignPatterns\Behavioral\State\Tests;

use DesignPatterns\Behavioral\State\ContextOrder;

use DesignPatterns\Behavioral\State\CreateOrder;

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 CreateOrder();

$contextOrder = new ContextOrder();

$contextOrder->setState($order);

$contextOrder->done();

$contextOrder->done();

$this->assertEquals('completed', $contextOrder->getStatus());

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。