相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說明
- thinkPHP5框架實(shí)現(xiàn)分頁查詢功能的方法示例
- PHP中單雙號(hào)與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
PHP設(shè)計(jì)模式之狀態(tài)模式定義與用法詳解
本文實(shí)例講述了PHP設(shè)計(jì)模式之狀態(tài)模式定義與用法。分享給大家供大家參考,具體如下:
什么是狀態(tài)設(shè)計(jì)模式
當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來像是改變了其類。
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)的條件表達(dá)式過于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類中,可以把復(fù)雜的判斷邏輯簡化。
什么時(shí)候使用狀態(tài)模式
對(duì)象中頻繁改變非常依賴于條件語句。 就其自身來說, 條件語句本身沒有什么問題(如switch語句或帶else子句的語句),不過, 如果選項(xiàng)太多, 以到程序開始出現(xiàn)混亂, 或者增加或改變選項(xiàng)需要花費(fèi)太多時(shí)間, 甚至成為一種負(fù)擔(dān), 這就出現(xiàn)了問題
對(duì)于狀態(tài)設(shè)計(jì)模式, 每個(gè)狀態(tài)都有自己的具體類, 它們實(shí)現(xiàn)一個(gè)公共接口. 我們不用查看對(duì)象的控制流, 而是從另一個(gè)角度來考慮, 即對(duì)象的狀態(tài).
狀態(tài)機(jī)是一個(gè)模型, 其重點(diǎn)包括不同的狀態(tài), 一個(gè)狀態(tài)到另一個(gè)狀態(tài)的變遷, 以及導(dǎo)致狀態(tài)改變的觸發(fā)器.
以開燈關(guān)燈為例子, 狀態(tài)模型的本質(zhì)分為3點(diǎn):
①狀態(tài)(關(guān)燈和開燈)
②變遷(從關(guān)燈到開燈, 以及從開燈到關(guān)燈)
③觸發(fā)器(燈開關(guān))
所以狀態(tài)模式都需要一個(gè)參與者來跟蹤對(duì)象所處的狀態(tài). 以Light為例, Light需要知道當(dāng)前狀態(tài)是什么.
示例:開燈關(guān)燈
Light.php
<?php class Light { private $offState; //關(guān)閉狀態(tài) private $onState; //開啟狀態(tài) private $currentState; //當(dāng)前狀態(tài) public function __construct() { $this->offState = new OffState($this); $this->onState = new OnState($this); //開始狀態(tài)為關(guān)閉狀態(tài)Off $this->currentState = $this->offState; } //調(diào)用狀態(tài)方法觸發(fā)器 public function turnLightOn() { $this->currentState->turnLightOn(); } public function turnLightOff() { $this->currentState->turnLightOff(); } //設(shè)置當(dāng)前狀態(tài) public function setState(IState $state) { $this->currentState = $state; } //獲取狀態(tài) public function getOnState() { return $this->onState; } public function getOffState() { return $this->offState; } }