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

學無先后,達者為師

網站首頁 編程語言 正文

C++設計模式狀態模式(State)

作者:嵌入式職場 更新時間: 2022-05-17 編程語言

目錄

1、狀態模式概念

2、模塊職責

3、代碼實現


1、狀態模式概念

State模式也叫狀態模式,是行為設計模式的一種。State模式允許通過改變對象的內部狀態而改變對象的行為,這個對象表現得就好像修改了它的類一樣。

狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過于復雜時的情況。把狀態的判斷邏輯轉譯到表現不同狀態的一系列類當中,可以把復雜的判斷邏輯簡化。

2、模塊職責

Context:用戶對象

擁有一個State類型的成員,以標識對象的當前狀態;

State:接口或基類

封裝與Context的特定狀態相關的行為;

ConcreteState:接口實現類或子類

實現了一個與Context某個狀態相關的行為。

適用于:對象的行為,依賴于它所處的當前狀態。行為隨狀態改變而改變的場景。

適用于:通過用戶的狀態來改變對象的行為。

3、代碼實現

#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

欄目分類
最近更新