1. 程式人生 > >2018/12/07《大話設計模式》【狀態模式】

2018/12/07《大話設計模式》【狀態模式】

aid 實現 建議 pub 模式 size 固定 一段 col

《 Forever 吳建豪》洗腦~

1:什麽是狀態模式?

  - 定義:當一個對象的內在狀態改變時,允許改變其行為,這個對象看起開像是改了其類。

  - 哎~又來了句讓人聽不明白的定義......

  - 看一段代碼來理解吧

class A {
    private $state;

    public function __construct($state)
    {
        $this->state = $state;
    }

    public function echo()
    {
        if ($this->state == 
A) { echo A; } elseif ($this->state == B) { echo B; } elseif (...) { // 其他狀態 } else { echo xx!; } } }

  - 這裏可以說,當 state 的狀態改變時候,會改變整個類行為。

  - 為了改變這個狀況,從而使用狀態模式,把每個條件的邏輯移到不同的類中,通過統一的接口定義

2:簡單實現一個狀態模式

<?php

interface State()
{
    public function handle(Context $context);
}

// 狀態A
class StateA implements State
{
    public function handle(Context $context)
    {
        if ($context->term = 1) {
            // 處理邏輯,並終止程序
        } else {
            $context.setState(new StateB());
        }
    }
}

// 狀態B class StateB implements State { public function handle(Context $context) { if ($context->term = 2) { // 處理邏輯,並終止程序 } else { $context.setState(new StateC()); } } } // 狀態C class StateC implements State { public function handle(Context $context) { // 如果還有其他狀態,則繼續往下走。如果沒有,就在次終止程序 } } // 新的Context類的實現 class Context { private $state;// 用來保存 State 對象 public function setState(State $state) { $this->state = $state; } public function request() { $this->state->handle($this); } }

3:應用場景

  - 如果項目中存在太多的 if {...} elseif {...} else {...} 。那麽你應該考慮狀態模式。我覺得這個是重點考慮對象

  - 如果每個狀態中處理的業務邏輯特別復雜·那麽建議考慮這種方式。

  - 如果代碼中的狀態相對固定。比如一個電商中購買商品的流程:未支付、已過期、待發貨(已支付)、已發貨、已收貨。那麽這種狀態基本上定下來不會有太大變化,狀態發生在內部中,順序固定,不需要客戶端進行處理。

  

4:參考

https://blog.csdn.net/hel12he/article/details/51787539

2018/12/07《大話設計模式》【狀態模式】