PHP設計模式之狀態模式(State)程式碼例項大全(29)
阿新 • • 發佈:2020-09-19
目的
狀態模式可以基於一個物件的同種事務而封裝出不同的行為。它提供一種簡潔的方式使得物件在執行時可以改變自身行為,而不必藉助單一龐大的條件判斷語句。
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 網際網路架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,收穫9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入我們的群啊,暗號:phpzh(君羊號碼856460874)。
內容不錯的話希望大家支援鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什麼問題 建議 想看的內容可以在評論提出