摘要:前言狀態(tài)設(shè)計模式是提出的最吸引人的模式之一,也是一種最有用的模式。狀態(tài)模式的作用就是允許對象在狀態(tài)改變時改變其行為。還有很多其他模擬應(yīng)用不一定是游戲也依賴于狀態(tài)模式。相關(guān)資料狀態(tài)模式
前言
狀態(tài)設(shè)計模式是Gof提出的最吸引人的模式之一,也是一種最有用的模式。游戲通常就采用狀態(tài)模式,因為游戲中的對象往往會非常頻繁地改變狀態(tài)。狀態(tài)模式的作用就是允許對象在狀態(tài)改變時改變其行為。還有很多其他模擬應(yīng)用(不一定是游戲)也依賴于狀態(tài)模式。本文將會談到并舉例說明。
按照傳統(tǒng)思維,如果有多個狀態(tài)的話一般就是用if、else if、switch處理了,但是這類的代碼看起來極其不美觀,最重要的是沒什么拓展性,維護性,復(fù)用性,還會出現(xiàn)“牽一發(fā)而動全身”的情況。如果把這些狀態(tài)封裝起來,就可以減少大量的判斷,那么就要用狀態(tài)模式了。
1、代碼遵循可拓展性強,可維護性強,復(fù)用性強,杜絕”牽一發(fā)而動全身”的情況。
2、減少使用大量的if、else if、switch判斷。
1、Work.php(它定義了時間程序需要的接口并維護一個具體狀態(tài)角色的實例,將與狀態(tài)相關(guān)的操作委托給當(dāng)前的具體對象來處理。)
current = new EarlyMorning(); } //設(shè)置狀態(tài) public function SetState($s) { $this->current = $s; } public function WriteCode() { return $this->current->WriteCode($this); } }
2、IState.php(定義一個接口以封裝使用上下文環(huán)境的的一個特定狀態(tài)相關(guān)的行為。)
3、EarlyMorning.php(實現(xiàn)抽象狀態(tài)定義的接口。)
//早晨工作狀態(tài) class EarlyMorning implements IState { public function WriteCode($w) { if($w->hour<6) { return Yii::t("yii","Good Early morning"); }else{ $w->SetState(new GoodMorning()); return $w->WriteCode(); //注意:這里必須都要return返回,否則調(diào)用客戶端代碼的時候無法賦值給$call。 } } } //早上工作狀態(tài) class GoodMorning implements IState { public function WriteCode($w) { if($w->hour<9) { return Yii::t("yii","Good morning"); }else{ $w->SetState(new GoodForenoon()); return $w->WriteCode(); } } } //上午工作狀態(tài) class GoodForenoon implements IState { public function WriteCode($w) { if($w->hour<12) { return Yii::t("yii","Good forenoon"); }else{ $w->SetState(new GoodNoon()); return $w->WriteCode(); } } } //中午工作狀態(tài) class GoodNoon implements IState { public function WriteCode($w) { if($w->hour<14) { return Yii::t("yii","Good noon"); }else{ $w->SetState(new GoodAfternoon()); return $w->WriteCode(); } } } //下午工作狀態(tài) class GoodAfternoon implements IState { public function WriteCode($w) { if($w->hour<17) { return Yii::t("yii","Good afternoon"); }else{ $w->SetState(new GoodDusk()); return $w->WriteCode(); } } } //傍晚工作狀態(tài) class GoodDusk implements IState { public function WriteCode($w) { if($w->hour<19) { return Yii::t("yii","Good dusk"); }else{ $w->SetState(new GoodNight()); return $w->WriteCode(); } } } //晚上工作狀態(tài) class GoodNight implements IState { public function WriteCode($w) { if($w->hour<22) { return Yii::t("yii","Good night"); }else{ $w->SetState(new GoodAtNight()); return $w->WriteCode(); } } } //夜里工作狀態(tài) class GoodAtNight implements IState { public function WriteCode($w) { return Yii::t("yii","Good at night"); } }調(diào)用客戶端代碼hour = date("H"); $call=$emergWork->WriteCode();增加狀態(tài)1、例如:在原來的應(yīng)用中增加個“半夜的狀態(tài)”。
1.1、在原夜里工作狀態(tài)類增加個if判斷,符合條件時調(diào)用半夜的工作狀態(tài)。hour<23) { return Yii::t("yii","Good at night"); }else{ $w->SetState(new Midnight()); return $w->WriteCode(); } } }1.2、新增一個半夜工作狀態(tài)類,里面寫要執(zhí)行的行為。
怎么樣,增加一個狀態(tài)是不是很簡單?拓展性非常好。
提醒注意1、實現(xiàn)狀態(tài)接口類中的$w->WriteCode()必須要return返回,否則調(diào)用客戶端代碼的時候無法賦值給$call,會直接echo輸出。
總結(jié)分析
2、實現(xiàn)狀態(tài)接口類中的public function WriteCode($w)方法里的$w對象類應(yīng)該是Work對象,不能是當(dāng)前類的對象。1、優(yōu)點
相關(guān)資料
1.1、狀態(tài)模式將與特定狀態(tài)相關(guān)的行為局部化,并且將不同狀態(tài)的行為分割開來。
1.2、所有狀態(tài)相關(guān)的代碼都存在于某個ConcereteState中,所以通過定義新的子類很容易地增加新的狀態(tài)和轉(zhuǎn)換。
1.3、狀態(tài)模式通過把各種狀態(tài)轉(zhuǎn)移邏輯分不到State的子類之間,來減少相互間的依賴。
2、缺點
2.1、導(dǎo)致較多的ConcreteState子類。狀態(tài)模式
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30420.html
摘要:概念觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關(guān)系,以便當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。觀察者模式符合接口隔離原則,實現(xiàn)了對象之間的松散耦合。 概念 觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關(guān)系,以便當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。 當(dāng)一個對象狀態(tài)發(fā)生改變后,會影響到其他幾個對象的改變,這...
摘要:設(shè)計觀察者模式是為了讓一個對象跟蹤某個狀態(tài),知道狀態(tài)何時改變,一旦狀態(tài)改變,所有訂閱對象都能得到通知。類與觀察者設(shè)計模式?jīng)]有內(nèi)在的關(guān)系,不過通過它其內(nèi)置的和方法可以很方便的將觀察者實例與一個主題實例相關(guān)聯(lián)以及解除關(guān)聯(lián)。 前言 知識就是作為觀察者所獲得的結(jié)論,經(jīng)過科學(xué)培訓(xùn)的觀察者會為我們提供所有能感知的現(xiàn)實。設(shè)計觀察者模式是為了讓一個對象跟蹤某個狀態(tài),知道狀態(tài)何時改變,一旦狀態(tài)改變,所有...
摘要:設(shè)計觀察者模式是為了讓一個對象跟蹤某個狀態(tài),知道狀態(tài)何時改變,一旦狀態(tài)改變,所有訂閱對象都能得到通知。類與觀察者設(shè)計模式?jīng)]有內(nèi)在的關(guān)系,不過通過它其內(nèi)置的和方法可以很方便的將觀察者實例與一個主題實例相關(guān)聯(lián)以及解除關(guān)聯(lián)。 前言 知識就是作為觀察者所獲得的結(jié)論,經(jīng)過科學(xué)培訓(xùn)的觀察者會為我們提供所有能感知的現(xiàn)實。設(shè)計觀察者模式是為了讓一個對象跟蹤某個狀態(tài),知道狀態(tài)何時改變,一旦狀態(tài)改變,所有...
摘要:設(shè)計觀察者模式是為了讓一個對象跟蹤某個狀態(tài),知道狀態(tài)何時改變,一旦狀態(tài)改變,所有訂閱對象都能得到通知。類與觀察者設(shè)計模式?jīng)]有內(nèi)在的關(guān)系,不過通過它其內(nèi)置的和方法可以很方便的將觀察者實例與一個主題實例相關(guān)聯(lián)以及解除關(guān)聯(lián)。 前言 知識就是作為觀察者所獲得的結(jié)論,經(jīng)過科學(xué)培訓(xùn)的觀察者會為我們提供所有能感知的現(xiàn)實。設(shè)計觀察者模式是為了讓一個對象跟蹤某個狀態(tài),知道狀態(tài)何時改變,一旦狀態(tài)改變,所有...
摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計模式五適配器模式適配器模式將某個對象的接生成器和協(xié)程的實現(xiàn)在這篇文章中,作者針對那些比較難以理解的概念,以一個更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場景 (PHP 實戰(zhàn)) 這篇文章主要介紹利用 R...
閱讀 3495·2021-11-12 10:36
閱讀 2875·2021-09-22 15:35
閱讀 2824·2021-09-04 16:41
閱讀 1174·2019-08-30 15:55
閱讀 3585·2019-08-29 18:43
閱讀 2079·2019-08-23 18:24
閱讀 1424·2019-08-23 18:10
閱讀 1928·2019-08-23 11:31