宣告:本系列部落格參考資料《大話設計模式》,作者程杰。
狀態模式
當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是
當控制乙個物件狀態的條件表示式過於複雜時的情況。
把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。
uml類圖:
角色:
上下文環境(
work):
它定義了客戶程式需要的介面並維護乙個具體狀態角色的例項,將與狀態相關的操作委託給當前
的具體物件
來處理。 抽象
狀態(state
):定義乙個介面以封裝使用上下文環境的的乙個特定狀態相關的行為。
具體狀態(
amstate
):實現
抽象狀態定義的介面。
核心**:
<?php
/** * created by phpstorm->
* user: jang
* date: 2015/6/10
* time: 10:34
*///狀態介面
inte***ce istate
//上午工作狀態
class amstate implements istate
else
}}//下午工作狀態
class pmstate implements istate
else
}}//晚上工作狀態
class nightstate implements istate
else
else}}
}//休息狀態
class breakstate implements istate
}//睡眠狀態
class sleepstate implements istate
}//工作狀態
class work
public $hour;
public $isdone;
public function setstate(istate $s)
public function writecode()
}
呼叫客戶端測試**:
//-------------------------狀態模式-------------------------
require_once "./state/state.php";
$emergwork = new work();
$emergwork->hour = 9;
$emergwork->writecode();
$emergwork->hour = 10;
$emergwork->writecode();
$emergwork->hour = 13;
$emergwork->writecode();
$emergwork->hour=14;
$emergwork->writecode();
$emergwork->hour = 17;
$emergwork->writecode();
$emergwork->isdone = true;
$emergwork->isdone = false;
$emergwork->hour = 19;
$emergwork->writecode();
$emergwork->hour = 22;
$emergwork->writecode();
適用場景:
1.乙個物件的行為取決於它的狀態,並且它
必須在執行時刻根據狀態改變它的行為。
2.乙個操作中含有龐大的多分支結構,並且這些分支決定於物件的狀態。
優點 1.狀態模式將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。
2.所有狀態相關的**都存在於某個
conceretestate
中,所以通過定義新的子類很容易地增加新的狀態和轉換。
3.狀態模式通過把各種狀態轉移邏輯分不到
state
的子類之間,來減少相互間的依賴。
缺點 導致較多的
concretestate
子類
php物件導向設計模式
PHP設計模式 狀態模式
今天學習的是 狀態模式 state 一種行為型模式。狀態模式從 結構上分析有點和職責鏈模式相似,每個狀態有自己的上限,一旦超出會成為另一種狀態。狀態模式的定義 允許乙個物件在其內部狀態改變時改變它的行為。而狀態模式就是分離物件的狀態,封裝到專門的狀態類中。優點是,把各個狀態分離開,便於橫向擴充套件,...
PHP設計模式 狀態模式
狀態設計模式是gof提出的最吸引人的模式之一,也是一種最有用的模式。遊戲通常就採用狀態模式,因為遊戲中的物件往往會非常頻繁地改變狀態。狀態模式的作用就是允許物件在狀態改變時改變其行為。還有很多其他模擬應用 不一定是遊戲 也依賴於狀態模式。本文將會談到並舉例說明。按照傳統思維,如果有多個狀態的話一般就...
php與設計模式 狀態模式
當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。demo created by phpstorm 狀態介面 inte ce istat...