PHP設計模式 狀態模式

2021-09-18 03:44:26 字數 2683 閱讀 8786

狀態設計模式是gof提出的最吸引人的模式之一,也是一種最有用的模式。遊戲通常就採用狀態模式,因為遊戲中的物件往往會非常頻繁地改變狀態。狀態模式的作用就是允許物件在狀態改變時改變其行為。還有很多其他模擬應用(不一定是遊戲)也依賴於狀態模式。本文將會談到並舉例說明。

按照傳統思維,如果有多個狀態的話一般就是用if、else if、switch處理了,但是這類的**看起來極其不美觀,最重要的是沒什麼拓展性,維護性,復用性,還會出現「牽一髮而動全身」的情況。如果把這些狀態封裝起來,就可以減少大量的判斷,那麼就要用狀態模式了。

1、**遵循可拓展性強,可維護性強,復用性強,杜絕」牽一髮而動全身」的情況。

2、減少使用大量的if、else if、switch判斷。

1、work.php(它定義了時間程式需要的介面並維護乙個具體狀態角色的例項,將與狀態相關的操作委託給當前的具體物件來處理。)

<?php 

namespace common\status;

//工作狀態

class work

//設定狀態

public function setstate($s)

public function writecode()

}

2、istate.php(定義乙個介面以封裝使用上下文環境的的乙個特定狀態相關的行為。)

<?php 

namespace common\status;

//狀態介面

inte***ce istate

3、earlymorning.php(實現抽象狀態定義的介面。)

//早晨工作狀態  

class earlymorning implements istate

else

} } //早上工作狀態

class goodmorning implements istate

else

} } //上午工作狀態

class goodforenoon implements istate

else

} } //中午工作狀態

class goodnoon implements istate

else

} } //下午工作狀態

class goodafternoon implements istate

else

} }//傍晚工作狀態

class gooddusk implements istate

else

} } //晚上工作狀態

class goodnight implements istate

else

} } //夜裡工作狀態

class goodatnight implements istate

}

<?php 

use common\status\work;

//問候語

$emergwork = new work();

$emergwork->hour = date("h");

$call=$emergwork->writecode();

1、例如:在原來的應用中增加個「半夜的狀態」。

1.1、在原夜裡工作狀態類增加個if判斷,符合條件時呼叫半夜的工作狀態。

<?php 

namespace common\status;

use yii;

use common\status\istate;

//夜裡工作狀態

class goodatnight implements istate

else

} }

1.2、新增乙個半夜工作狀態類,裡面寫要執行的行為。

<?php 

namespace common\status;

use yii;

use common\status\istate;

//半夜工作狀態

class midnight implements istate

}

怎麼樣,增加乙個狀態是不是很簡單?拓展性非常好。

1、實現狀態介面類中的$w->writecode()必須要return返回,否則呼叫客戶端**的時候無法賦值給$call,會直接echo輸出。

2、實現狀態介面類中的public function writecode($w)方法裡的$w物件類應該是work物件,不能是當前類的物件。

1、優點

1.1、狀態模式將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。

1.2、所有狀態相關的**都存在於某個conceretestate中,所以通過定義新的子類很容易地增加新的狀態和轉換。

1.3、狀態模式通過把各種狀態轉移邏輯分不到state的子類之間,來減少相互間的依賴。

2、缺點

2.1、導致較多的concretestate子類。

狀態模式

PHP設計模式 狀態模式

宣告 本系列部落格參考資料 大話設計模式 作者程杰。狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是 當控制乙個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。uml類圖 角色 上下...

PHP設計模式 狀態模式

今天學習的是 狀態模式 state 一種行為型模式。狀態模式從 結構上分析有點和職責鏈模式相似,每個狀態有自己的上限,一旦超出會成為另一種狀態。狀態模式的定義 允許乙個物件在其內部狀態改變時改變它的行為。而狀態模式就是分離物件的狀態,封裝到專門的狀態類中。優點是,把各個狀態分離開,便於橫向擴充套件,...

php與設計模式 狀態模式

當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。demo created by phpstorm 狀態介面 inte ce istat...