国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP設(shè)計(jì)模式——狀態(tài)模式

Coding01 / 1531人閱讀

摘要:前言狀態(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輸出。
2、實(shí)現(xiàn)狀態(tài)接口類中的public function WriteCode($w)方法里的$w對(duì)象類應(yīng)該是Work對(duì)象,不能是當(dāng)前類的對(duì)象。

總結(jié)分析

1、優(yōu)點(diǎ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子類。

相關(guān)資料

狀態(tài)模式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30420.html

相關(guān)文章

  • PHP設(shè)計(jì)模式之觀察者模式

    摘要:概念觀察者模式屬于行為模式,是定義對(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ì)象的改變,這...

    phpmatt 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式——觀察者模式

    摘要:設(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)改變,所有...

    Barrior 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式——觀察者模式

    摘要:設(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)改變,所有...

    KoreyLee 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式——觀察者模式

    摘要:設(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)改變,所有...

    lifefriend_007 評(píng)論0 收藏0
  • PHP基礎(chǔ)

    摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...

    HtmlCssJs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<