propósito
El modo de estado puede encapsular diferentes comportamientos basados en el mismo tipo de transacción de un objeto. Proporciona una forma concisa para que un objeto cambie su comportamiento en tiempo de ejecución sin tener que recurrir a una sola sentencia de juicio condicional grande.
Gráficos UML
Código
- 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();
}
}
prueba
- Pruebas / 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());
}
}
El camino de crecimiento de PHP Internet Architect * La guía definitiva para "patrones de diseño"
Entrevista con 10 empresas, obtenga 9 ofertas, preguntas de la entrevista PHP en 2020
★ Si le gusta mi artículo y desea comunicarse y aprender con desarrolladores más experimentados, obtenga más asesoría técnica y orientación relacionada con entrevistas con grandes fábricas, bienvenido a unirse a nuestro grupo, contraseña: phpzh (número de Junyang 856460874).
El último tutorial avanzado de PHP en 2020, ¡serie completa!
Si el contenido es bueno, espero que todos te apoyen y animen a dar un like / like, y bienvenidos a comunicarnos juntos; además, si tienes alguna duda, puedes sugerir lo que quieres ver en los comentarios.