2018/12/07《大話設計模式》【狀態模式】
阿新 • • 發佈:2018-12-08
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《大話設計模式》【狀態模式】