PHP設計パターンの状態モード(State)コード例(29)

目的

状態モードでは、オブジェクトの同じ種類のトランザクションに基づいて異なる動作をカプセル化できます。これは、単一の大きな条件付き判断ステートメントに頼ることなく、オブジェクトが実行時にその動作を変更する簡潔な方法を提供します。

UML图

★公式のPHPアドバンストラーニングエクスチェンジコミュニティの「クリック」管理で一部の資料を整理します。BATおよびその他の第一線の会社は、高度なナレッジシステム(関連するラーニングマテリアルおよびインタビューの質問)を備えており、分散アーキテクチャ、高スケーラビリティ、高パフォーマンス、高並行性、サーバーパフォーマンスチューニング、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql最適化、シェルスクリプト、Docker、マイクロサービス、Nginxおよびその他のナレッジポイント、高度な高度なドライグッズ

コード

  • 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 Internet Architectの成長パス*「デザインパターン」の究極のガイド

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

10社へのインタビュー、9件のオファー、2020年のPHPインタビューの質問

★私の記事が気に入って、上級開発者とコミュニケーションを取り、学びたい場合は、大きな工場へのインタビューに関する技術的な相談やガイダンスを受けてください。パスワード、phpzh(Junyang番号856460874)へようこそ。

2020年の最新のPHP高度なチュートリアル、フルシリーズ!

内容が良かったら、いいね、いいね!を付けて、コミュニケーションを歓迎します。また、質問がある場合は、コメントで見たいものを提案してください。

おすすめ

転載: blog.csdn.net/weixin_43814458/article/details/108680876
おすすめ