狀態模式當一個對象的內在狀態改變時容許改變其行爲,這個對象看起來像是改變了其類。狀態模式主要解決的是當控制一個對象狀態的條件表達式過於複雜時的狀況。把狀態的判斷邏輯轉移到表示不一樣狀態的一系列類中,能夠把複雜的判斷邏輯簡化。
UML類圖:
角色:
上下文環境(Work):它定義了客戶程序須要的接口並維護一個具體狀態角色的實例,將與狀態相關的操做委託給當前的具體對象來處理。
抽象狀態(State):定義一個接口以封裝使用上下文環境的的一個特定狀態相關的行爲。
具體狀態(AmState):實現抽象狀態定義的接口。php
<?php interface State { // 抽象狀態角色 public function handle(Context $context); // 方法示例 } class ConcreteStateA implements State { // 具體狀態角色A private static $_instance = null; private function __construct() {} public static function getInstance() { // 靜態工廠方法,返還此類的惟一實例 if (is_null(self::$_instance)) { self::$_instance = new ConcreteStateA(); } return self::$_instance; } public function handle(Context $context) { echo 'concrete_a'."<br>"; $context->setState(ConcreteStateB::getInstance()); } } class ConcreteStateB implements State { // 具體狀態角色B private static $_instance = null; private function __construct() {} public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new ConcreteStateB(); } return self::$_instance; } public function handle(Context $context) { echo 'concrete_b'."<br>"; $context->setState(ConcreteStateA::getInstance()); } } class Context { // 環境角色 private $_state; public function __construct() { // 默認爲stateA $this->_state = ConcreteStateA::getInstance(); } public function setState(State $state) { $this->_state = $state; } public function request() { $this->_state->handle($this); } } // client $context = new Context(); $context->request(); $context->request(); $context->request(); $context->request(); /* 輸出: concrete_a concrete_b concrete_a concrete_b */