Ejemplos de código de modo de estado (estado) del patrón de diseño PHP (29)

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

★ Gestión de "clic" de la comunidad oficial de intercambio de aprendizaje avanzado PHP para organizar algunos materiales, BAT y otras empresas de primera línea tienen sistemas de conocimiento avanzados (materiales de aprendizaje relevantes y preguntas de entrevistas escritas) y no se limitan a: arquitectura distribuida, alta escalabilidad, alta Rendimiento, alta concurrencia, ajuste del rendimiento del servidor, TP6, laravel, YII2, Redis, Swoole, Swoft, Kafka, optimización de Mysql, scripts de shell, Docker, microservicios, Nginx y otros puntos de conocimiento, productos secos avanzados avanzados

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"

PHP Internet Architect 50K Growth Guide + Guía de resolución de problemas de la industria (actualización continua)

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.

Supongo que te gusta

Origin blog.csdn.net/weixin_43814458/article/details/108680876
Recomendado
Clasificación