23种设计模式C++源码与UML实现--状态模式
生活随笔
收集整理的這篇文章主要介紹了
23种设计模式C++源码与UML实现--状态模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
狀態模式
State模式也叫狀態模式,是行為模式的一種,State模式允許通過改變對象的內部狀態而改變對象的行為,這個對象變現的好像修改了它的類一樣。
狀態模式主要解決的事當控制一個對象狀態的條件表達式過于復雜時的情況。把狀態的判斷邏輯轉移到變現不同的一系列類當中,可以把復雜的判斷邏輯簡化。
角色和職責
Context用戶對象
擁有一個State類型的成員,以標識對象的當前狀態
State接口或基類
封裝與Context的特定狀態相關的行為
ConcreteState接口實現類或子類
實現一個與Context某個狀態相關的行為
適用于:對象的行為,依賴于它所處的當前狀態。行為隨著狀態而改變的場景
適用于,用戶通過狀態來改變對象的行為。
// // Created by andrew on 2020/11/29. // #include <iostream>using namespace std;class Worker;class State { public:virtual ~State() = default;virtual void doSomeThing(Worker *w); };void State::doSomeThing(Worker *w) {}class Worker { public:Worker();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);}public:int getHour() const {return m_hour;}private:int m_hour{};State *m_currState{}; // 對象當前狀態 };class State1 : public State { public:void doSomeThing(Worker * w) override; };class State2 : public State { public:void doSomeThing(Worker * w) override; };void State1::doSomeThing(Worker *w) {if(w->getHour() == 7 || w->getHour() == 0){cout << "morning " << endl;}else{delete w->getCurrentState();w->setCurrentState(new State2); // 狀態1不滿足,轉到狀態2w->getCurrentState()->doSomeThing(w);} }void State2::doSomeThing(Worker *w) {if(w->getHour() == 9 || w->getHour() == 10){cout << "work" << endl;}else{delete w->getCurrentState(); // 狀態2不滿足轉到狀態w->setCurrentState(new State1);cout << "當錢時間點:" << w->getHour() << "unkonwn" << endl;} }Worker::Worker() {m_currState = new State1; }int main(int argc, char *argv[]) {auto *w1 = new Worker;w1->setHour(7);w1->doSomeThing();w1->setHour(9);w1->doSomeThing();delete w1;cout << "state demo" << endl;return 0; }總結
以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 23种设计模式C++源码与UML实现--
- 下一篇: 【高等数学】拉格朗日乘数法