Os exemplos de código do modo de estado (estado) do padrão de design do PHP (29)

objetivo

O modo de estado pode encapsular diferentes comportamentos com base no mesmo tipo de transação de um objeto. Ele fornece uma maneira concisa para um objeto alterar seu comportamento em tempo de execução sem ter que recorrer a uma única instrução de julgamento condicional grande.

Gráficos UML

★ Comunidade oficial de intercâmbio de aprendizagem avançada "click" de gerenciamento para organizar alguns materiais, a BAT e outras empresas de primeira linha têm sistemas de conhecimento avançados (materiais de aprendizagem relevantes e perguntas de entrevista por escrito) e não se limitam a: arquitetura distribuída, alta escalabilidade, alta Desempenho, alta simultaneidade, ajuste de desempenho do servidor, TP6, laravel, YII2, Redis, Swoole, Swoft, Kafka, otimização Mysql, scripts de shell, Docker, microsserviços, Nginx e outros pontos de conhecimento, produtos secos avançados avançados

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();
    }
}

teste

  • Testes / 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());
    }
}

O caminho de crescimento do arquiteto de Internet PHP * O guia definitivo para "padrões de design"

PHP Internet Architect 50K Growth Guide + Industry Problem Solving Guide (Continuous Update)

Entrevista com 10 empresas, obtenha 9 ofertas, perguntas da entrevista PHP em 2020

★ Se você gosta do meu artigo e deseja se comunicar e aprender com mais desenvolvedores sênior, obtenha mais consultoria técnica e orientação relacionada a entrevistas com grandes fábricas, bem-vindo ao nosso grupo, senha: phpzh (Junyang número 856460874).

O último tutorial avançado de PHP em 2020, série completa!

Se o conteúdo for bom, espero que todos apoiem e incentivem a dar um like / like, e sejam bem-vindos a se comunicarem juntos; além disso, se você tiver alguma dúvida, pode sugerir o que deseja ver nos comentários.

Acho que você gosta

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