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