目的
状態モードでは、オブジェクトの同じ種類のトランザクションに基づいて異なる動作をカプセル化できます。これは、単一の大きな条件付き判断ステートメントに頼ることなく、オブジェクトが実行時にその動作を変更する簡潔な方法を提供します。
UML图
コード
- 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();
}
}
テスト
- 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());
}
}
PHP Internet Architectの成長パス*「デザインパターン」の究極のガイド
PHP Internet Architect 50K Growth Guide + Industry Problem Solving Guide(Continuous Update)
10社へのインタビュー、9件のオファー、2020年のPHPインタビューの質問
★私の記事が気に入って、上級開発者とコミュニケーションを取り、学びたい場合は、大きな工場へのインタビューに関する技術的な相談やガイダンスを受けてください。パスワード、phpzh(Junyang番号856460874)へようこそ。
2020年の最新のPHP高度なチュートリアル、フルシリーズ!
内容が良かったら、いいね、いいね!を付けて、コミュニケーションを歓迎します。また、質問がある場合は、コメントで見たいものを提案してください。