日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C++設(shè)計(jì)模式狀態(tài)模式(State)

作者:嵌入式職場(chǎng) 更新時(shí)間: 2022-05-17 編程語(yǔ)言

目錄

1、狀態(tài)模式概念

2、模塊職責(zé)

3、代碼實(shí)現(xiàn)


1、狀態(tài)模式概念

State模式也叫狀態(tài)模式,是行為設(shè)計(jì)模式的一種。State模式允許通過(guò)改變對(duì)象的內(nèi)部狀態(tài)而改變對(duì)象的行為,這個(gè)對(duì)象表現(xiàn)得就好像修改了它的類一樣。

狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)譯到表現(xiàn)不同狀態(tài)的一系列類當(dāng)中,可以把復(fù)雜的判斷邏輯簡(jiǎn)化。

2、模塊職責(zé)

Context:用戶對(duì)象

擁有一個(gè)State類型的成員,以標(biāo)識(shí)對(duì)象的當(dāng)前狀態(tài);

State:接口或基類

封裝與Context的特定狀態(tài)相關(guān)的行為;

ConcreteState:接口實(shí)現(xiàn)類或子類

實(shí)現(xiàn)了一個(gè)與Context某個(gè)狀態(tài)相關(guān)的行為。

適用于:對(duì)象的行為,依賴于它所處的當(dāng)前狀態(tài)。行為隨狀態(tài)改變而改變的場(chǎng)景。

適用于:通過(guò)用戶的狀態(tài)來(lái)改變對(duì)象的行為。

3、代碼實(shí)現(xiàn)

#include 

using namespace std;

class Worker;

class State {
public:
    virtual void doSomeThing(Worker *w) = 0;
};

class Worker {
public:
    Worker();
    int getHour()
    {
        return m_hour;
    }

    void setHour(int hour)
    {
        m_hour = hour;
    }

    State* getCurrentState()
    {
        return m_currstate;
    }

    void setCurrentState(State *state)
    {
        m_currstate = state;
    }

    void doSomeThing()
    {
        m_currstate->doSomeThing(this);
    }

private:
    int m_hour;
    State *m_currstate;
};

class State1 : public State {
public:
    void doSomeThing(Worker *w);
};

class State2 : public State {
public:
    void doSomeThing(Worker *w);
};

void State1::doSomeThing(Worker *w) {
    if(w->getHour() == 7 || w->getHour() == 8)
    {
        cout << "eat food!" <getCurrentState();
        w->setCurrentState(new State2);
        w->getCurrentState()->doSomeThing(w);
    }
}

void State2::doSomeThing(Worker *w) {
    if(w->getHour() == 9 || w->getHour() == 10)
    {
        cout << "working!" << endl;
    }
    else
    {
        delete w->getCurrentState();
        w->setCurrentState(new State1);
        cout << "currenttime:" << w->getHour() << endl;
    }
}

Worker::Worker() {
    m_currstate = new State1;
}

int main(){
    Worker *w1 = new Worker;
    w1->setHour(7);
    w1->doSomeThing();

    w1->setHour(9);
    w1->doSomeThing();

    delete w1;
    return 0;
}

原文鏈接:https://fanjufei.blog.csdn.net/article/details/124794664

欄目分類
最近更新