状态模式能够基于一个对象的同种事务而封装出不一样的行为。它提供一种简洁的方式使得对象在运行时能够改变自身行为,而没必要借助单一庞大的条件判断语句。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(); } }
<?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']; } }
<?php namespace DesignPatterns\Behavioral\State; class ShippingOrder extends StateOrder { public function __construct() { $this->setStatus('shipping'); } protected function done() { $this->setStatus('completed'); } }
<?php namespace DesignPatterns\Behavioral\State; class CreateOrder extends StateOrder { public function __construct() { $this->setStatus('created'); } protected function done() { static::$state = new ShippingOrder(); } }
<?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 成长指南+行业问题解决总纲(持续更新)sql
面试10家公司,收获9个offer,2020年PHP 面试问题shell
★若是喜欢个人文章,想与更多资深开发者一块儿交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入咱们的群啊,暗号:phpzh(君羊号码856460874)。设计模式
内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出架构