一、意圖
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類
狀態模式變化的位置在於對象的狀態
二、狀態模式結構圖
三、狀態模式中主要角色
抽象狀態(State)角色:定義一個接口,用以封裝環境對象的一個特定的狀態所對應的行為
具體狀態(ConcreteState)角色:每一個具體狀態類都實現了環境(Context)的一個狀態所對應的行為
環境(Context)角色:定義客戶端所感興趣的接口,並且保留一個具體狀態類的實例。這個具體狀態類的實例給出此環境對象的現有狀態
四、狀態模式的優點和缺點
1、它將與特定狀態相關的行為局部化
2、它使得狀態轉換顯示化
3、State對象可被共享
五、狀態模式適用場景
1、一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為
2、一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常,有多個操作包含這一相同的條件結構。State模式模式將每一個條件分支放入一個獨立的類中。這使得你可以要所對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴於其他對象而獨立變化
六、狀態模式與其它模式
單例模式(singleton模式):具體狀態對象通常是單例模式
享元模式(flyweight模式):享元模式解釋了何時以及怎樣共享狀態對象
七、狀態模式PHP示例
<?php
/**
* 抽象狀態角色
*/
interface State {
/**
* 方法示例
*/
public function handle(Context $context);
}
/**
* 具體狀態角色A
* 單例類
*/
class ConcreteStateA implements State {
/* 唯一的實例 */
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 Sate A handle method<br />';
$context->setState(ConcreteStateB::getInstance());
}
}
/**
* 具體狀態角色B
* 單例類
*/
class ConcreteStateB implements State {
/* 唯一的實例 */
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 Sate B handle method<br />';
$context->setState(ConcreteStateA::getInstance());
}
}
/**
* 環境角色
*/
class Context {
private $_state;
/**
* 默認為StateA
*/
public function __construct() {
$this->_state = ConcreteStateA::getInstance();
}
public function setState(State $state) {
$this->_state = $state;
}
public function request() {
$this->_state->handle($this);
}
}
/**
* 客戶端
*/
class Client {
/**
* Main program.
*/
public static function main() {
$context = new Context();
$context->request();
$context->request();
$context->request();
$context->request();
}
}
Client::main();
?>
以上就是使用php實現狀態模式的代碼,還有一些關於狀態模式的概念區分,希望對大家的學習有所幫助。