国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(十一)Head first design patterns狀態(tài)模式(c++)

這篇具有很好參考價(jià)值的文章主要介紹了(十一)Head first design patterns狀態(tài)模式(c++)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

狀態(tài)模式

如何去描述狀態(tài)機(jī)?

假設(shè)你需要實(shí)例化一臺(tái)電梯,并模仿出電梯的四個(gè)狀態(tài):開(kāi)啟、關(guān)閉、運(yùn)行、停止。也許你會(huì)這么寫(xiě)

class ILift{
public:
    virtual void open(){}
    virtual void close(){}
    virtual void run(){}
    virtual void stop(){}
};
class Lift : public ILift{
public:
    void open(){ std::cout << "電梯門(mén)關(guān)閉..." << std::endl; }
    void close(){ std::cout << "電梯門(mén)開(kāi)啟..." << std::endl; }
    void run(){ std::cout << "電梯上下跑起來(lái)..." << std::endl; }
    void stop(){ std::cout << "電梯停止了..." << std::endl; }
};
int main(){
    ILift* lift = new Lift();
    lift->open();
    lift->close();
    lift->run();
    lift->stop();
}

這樣寫(xiě)未免太草率了。因?yàn)殡娞菰陂T(mén)開(kāi)啟的時(shí)候一般是不能運(yùn)行的,在運(yùn)行的時(shí)候一般也不會(huì)門(mén)開(kāi)啟,而在停止工作狀態(tài)一般不會(huì)再去執(zhí)行關(guān)門(mén)這個(gè)動(dòng)作。所以需要設(shè)置一些狀態(tài)去限制這臺(tái)電梯的行為。于是在類(lèi)Lift中存儲(chǔ)電梯目前的狀態(tài),在執(zhí)行每個(gè)動(dòng)作的時(shí)候用swith分支來(lái)判斷當(dāng)前動(dòng)作是否有效,以及更新當(dāng)前狀態(tài)。于是有了下面的代碼

(十一)Head first design patterns狀態(tài)模式(c++),設(shè)計(jì)模式cpp,設(shè)計(jì)模式,狀態(tài)模式,c++

class ILift{
public:
    virtual void setState(int state){};
    virtual void open(){}
    virtual void close(){}
    virtual void run(){}
    virtual void stop(){}
};
class Lift : public ILift{
public:
    Lift(int state):state(state){}
    void setState(int state){ this->state = state; }
    void close(){
        switch(state){
            case OPENING_STATE:
                closeWithoutLogic();
                setState(CLOSING_STATE);
                break;
            case CLOSING_STATE:
                break;
            case RUNNING_STATE:
                break;
            case STOPPING_STATE:
                break;
        }
    }
    void open(){
        switch(state){
            case OPENING_STATE:
                break;
            case CLOSING_STATE:
                openWithoutLogic();
                setState(OPENING_STATE);
                break;
            case RUNNING_STATE:
                break;
            case STOPPING_STATE:
                openWithoutLogic();
                setState(OPENING_STATE);
        }
    }
    void run(){
        switch(state){
            case OPENING_STATE:
                break;
            case CLOSING_STATE:
                runWithoutLogic();
                setState(RUNNING_STATE);
                break;
            case RUNNING_STATE:
                break;
            case STOPPING_STATE:
                runWithoutLogic();
                setState(RUNNING_STATE);
        }
    }
    void stop(){
        switch(state){
            case OPENING_STATE:
                break;
            case CLOSING_STATE:
                stopWithoutLogic();
                setState(STOPPING_STATE);
                break;
            case RUNNING_STATE:
                stopWithoutLogic();
                setState(STOPPING_STATE);
                break;
            case STOPPING_STATE:
                break;
        }
    }
    void closeWithoutLogic(){ std::cout << "電梯門(mén)關(guān)閉..." << std::endl; }
    void openWithoutLogic() { std::cout << "電梯門(mén)開(kāi)啟..." << std::endl; }
    void runWithoutLogic()  { std::cout << "電梯上下跑起來(lái)..." << std::endl; }
    void stopWithoutLogic() { std::cout << "電梯停止了..." << std::endl; }
private:
    int state;
};
int main(){
    ILift* lift = new Lift(STATE(OPENING_STATE));
    lift->close(); // 關(guān)閉
    lift->open();  // 開(kāi)啟
    lift->run();   // 無(wú)動(dòng)作
    lift->stop();  // 無(wú)動(dòng)作
    lift->close(); // 關(guān)閉
}

這個(gè)類(lèi)的實(shí)現(xiàn)代碼特別長(zhǎng),內(nèi)部包含了太多的switch語(yǔ)句。而且當(dāng)需要增加狀態(tài)時(shí),比如說(shuō)電梯停電狀態(tài)和電梯維修狀態(tài),就需要去更改里面的switch語(yǔ)句。這樣寫(xiě)違背了開(kāi)閉原則以及單一性原則。為了在增加狀態(tài)的時(shí)候盡量少的修改原有代碼,可以將swtich中的每個(gè)狀態(tài)抽離出來(lái)單獨(dú)包裝成類(lèi)。

(十一)Head first design patterns狀態(tài)模式(c++),設(shè)計(jì)模式cpp,設(shè)計(jì)模式,狀態(tài)模式,c++

創(chuàng)建context類(lèi),在context類(lèi)中存有LiftState對(duì)象用來(lái)記錄當(dāng)前的狀態(tài)。此時(shí)context目前擁有四種狀態(tài)對(duì)象,用指針維護(hù)。每種狀態(tài)的邏輯由各自類(lèi)在內(nèi)部實(shí)現(xiàn)。當(dāng)電梯發(fā)生動(dòng)作,即context調(diào)用函數(shù)時(shí),函數(shù)內(nèi)部會(huì)調(diào)用當(dāng)前state對(duì)應(yīng)的方法,于是這部分邏輯轉(zhuǎn)交由state內(nèi)部實(shí)現(xiàn)。具體代碼如下:

#include<iostream>
#include<string>

using namespace std;

class ContextBase;
class LiftState{
public:
    void setContext(ContextBase* context){ this->mContext = context; }
    virtual void open(){}
    virtual void close(){}
    virtual void run(){}
    virtual void stop(){}
    ContextBase* getContext(){ return mContext; }
public:
    ContextBase* mContext;
};
class ContextBase{
public:
    ContextBase(){}
    virtual LiftState* getLiftState(){}
    virtual LiftState* getOpenningState(){}
    virtual LiftState* getClosingState(){}
    virtual LiftState* getRunningState(){}
    virtual LiftState* getStoppingState(){}
    virtual void setLiftState(LiftState* liftState){}
    virtual void open(){}
    virtual void close(){}
    virtual void run(){}
    virtual void stop(){}
public:
    LiftState* liftState;
};
class OpenningState : public LiftState{
    void open(){
        std::cout << "lift open..." << std::endl;
    }
    void close(){
        mContext->setLiftState(mContext->getClosingState());
        mContext->getLiftState()->close();
    }
    void run(){}
    void stop(){}
};
class ClosingState : public LiftState{
    void open(){
        mContext->setLiftState(mContext->getOpenningState());
        mContext->getLiftState()->open();
    }
    void close(){
        std::cout << "lift close..." << std::endl;
    }
    void run(){
        mContext->setLiftState(mContext->getRunningState());
        mContext->getLiftState()->run();
    }
    void stop(){
        mContext->setLiftState(mContext->getStoppingState());
        mContext->getLiftState()->stop();
    }
};
class RunningState : public LiftState{
    void open(){
    }
    void close(){
    }
    void run(){
        std::cout << "lift running..." << std::endl;
    }
    void stop(){
        mContext->setLiftState(mContext->getStoppingState());
        mContext->getLiftState()->stop();
    }
};
class StoppingState : public LiftState{
    void open(){
        mContext->setLiftState(mContext->getOpenningState());
        mContext->getLiftState()->open();
    }
    void close(){
    }
    void run(){
        mContext->setLiftState(mContext->getRunningState());
        mContext->getLiftState()->run();
    }
    void stop(){
        std::cout << "lift stopping..." << std::endl;
    }
};

class Context : public ContextBase{
public:
    Context(){}
    LiftState* getLiftState(){
        return liftState;
    }
    LiftState* getOpenningState(){
        return openningState;
    }
    LiftState* getClosingState(){
        return closingState;
    }
    LiftState* getRunningState(){
        return runningState;
    }
    LiftState* getStoppingState(){
        return stoppingState;
    }
    void setLiftState(LiftState* liftState){
        this->liftState = liftState;
        this->liftState->setContext(this);
    }
    void open(){ liftState->open(); }
    void close(){ liftState->close(); }
    void run(){ liftState->run(); }
    void stop(){ liftState->stop(); }
public:
    LiftState* openningState = new OpenningState();
    LiftState* closingState  = new ClosingState();
    LiftState* runningState  = new RunningState();
    LiftState* stoppingState = new StoppingState();
};

int main(){
    Context* context = new Context;
    context->setLiftState(new ClosingState());
    context->open();
    context->close();
    context->run();
    context->stop();
}

狀態(tài)模式的優(yōu)勢(shì):

當(dāng)由新的狀態(tài)加入時(shí),只需要擴(kuò)展子類(lèi),而不需要過(guò)多地更改原有代碼。遵守了開(kāi)閉原則。

當(dāng)動(dòng)作和狀態(tài)更新等邏輯交由狀態(tài)類(lèi)內(nèi)部實(shí)現(xiàn),實(shí)現(xiàn)了單一性設(shè)計(jì)原則。

參考

Java設(shè)計(jì)模式——狀態(tài)模式(STATE PATTERN)_java中state pattern-CSDN博客???????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-817443.html

到了這里,關(guān)于(十一)Head first design patterns狀態(tài)模式(c++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——策略模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 將行為想象為一族算法,定義算法族,分別封裝起來(lái),讓他們之間可以互相替換,使得算

    2024年02月11日
    瀏覽(26)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——工廠方法模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。Factory Method 使得一個(gè)類(lèi)的實(shí)

    2024年02月10日
    瀏覽(29)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——構(gòu)建器模式 C++實(shí)現(xiàn)

    【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——構(gòu)建器模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 ? 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程(穩(wěn)定)可以創(chuàng)建不同

    2024年02月09日
    瀏覽(23)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——抽象工廠模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 提供一個(gè)接口,讓該接口負(fù)責(zé)創(chuàng)建一系列“相關(guān)或者相互依賴(lài)的對(duì)象”,無(wú)需指定他們具

    2024年02月10日
    瀏覽(20)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——裝飾者模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 動(dòng)態(tài)地將責(zé)任附加到對(duì)象上,若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。

    2024年02月10日
    瀏覽(24)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——觀察者模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 主題對(duì)象(出版者)管理某些數(shù)據(jù),當(dāng)主題內(nèi)的數(shù)據(jù)改變,就會(huì)通知觀察者(訂閱者)。

    2024年02月10日
    瀏覽(27)
  • 設(shè)計(jì)模式二十一:狀態(tài)模式(State Pattern)

    一個(gè)對(duì)象的內(nèi)部狀態(tài)發(fā)生變化時(shí),允許對(duì)象改變其行為。這種模式使得一個(gè)對(duì)象看起來(lái)好像在運(yùn)行時(shí)改變了它的類(lèi),主要目的是將狀態(tài)的行為從主要對(duì)象中分離出來(lái),使得主要對(duì)象不必包含所有狀態(tài)的邏輯,而是將每個(gè)狀態(tài)的行為封裝在獨(dú)立的類(lèi)中。這有助于減少代碼的重復(fù)

    2024年02月11日
    瀏覽(18)
  • 【Head First 設(shè)計(jì)模式】-- 觀察者模式

    【Head First 設(shè)計(jì)模式】-- 觀察者模式

    客戶有一個(gè)WeatherData對(duì)象,負(fù)責(zé)追蹤溫度、濕度和氣壓等數(shù)據(jù)。現(xiàn)在客戶給我們提了個(gè)需求,讓我們利用WeatherData對(duì)象取得數(shù)據(jù),并更新三個(gè)布告板:目前狀況、氣象統(tǒng)計(jì)和天氣預(yù)報(bào)。 WeatherData對(duì)象提供了4個(gè)接口: getTemperature():獲取溫度 getHumidity():獲取濕度 getPressure():獲

    2024年02月05日
    瀏覽(16)
  • 【設(shè)計(jì)模式】Bridge Design pattern 橋接模式

    【設(shè)計(jì)模式】Bridge Design pattern 橋接模式

    多個(gè)維度的變化引起的繼承組合指數(shù)級(jí)增長(zhǎng) 例子 一個(gè)物體有不同形狀和不同顏色,如何用類(lèi)來(lái)表示它們,這里包含了兩個(gè)變化維度,一個(gè)是物體的形狀,一個(gè)是顏色 繼承的方式 如果使用繼承的方式,此時(shí)要增加一個(gè)形狀就要多兩個(gè)類(lèi),或者增加一個(gè)顏色也要多兩個(gè)類(lèi),這個(gè)

    2023年04月08日
    瀏覽(22)
  • 設(shè)計(jì)模式十一:外觀模式(Facade Pattern)

    外觀模式(Facade Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它提供了一個(gè)統(tǒng)一的接口,用于訪問(wèn)系統(tǒng)中的一組復(fù)雜子系統(tǒng)。外觀模式通過(guò)將復(fù)雜子系統(tǒng)的接口封裝在一個(gè)高層接口中,簡(jiǎn)化了客戶端與子系統(tǒng)之間的交互,使得客戶端代碼更加清晰、簡(jiǎn)潔。 外觀模式的使用場(chǎng)景包括: 簡(jiǎn)化

    2024年02月13日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包