生活随笔
收集整理的這篇文章主要介紹了
状态模式(c++实现)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
狀態(tài)模式
模式定義
狀態(tài)模式(state),當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類(lèi)。
模式動(dòng)機(jī)
- 狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類(lèi)當(dāng)中,可以把復(fù)雜的判斷邏輯簡(jiǎn)化。
- 當(dāng)一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變它的行為時(shí),就可以考慮使用狀態(tài)模式了。
UML類(lèi)圖
源碼實(shí)現(xiàn)
#include <string>
class People;class State
{
public:State(std::string context);virtual ~State();virtual void Handle(People* people) = 0;std::string Content();
protected:std::string m_Content;private:int m_Time;
};
#include "state.h"class People
{
public:People(State* state);void ChangeState(State* state);void Show();void SetTime(int time);int Time();
private:int m_Now;State* m_State;
};
#include <iostream>
#include "people.h"People::People(State* state):m_State(state)
{}void People::ChangeState(State* state)
{m_State = state;
}void People::Show()
{std::cout << "來(lái)吧,展示!" << std::endl;std::cout << "當(dāng)前狀態(tài):" << m_State->Content() << std::endl;
}void People::SetTime(int time)
{m_Now = time;m_State->Handle(this);
}int People::Time()
{return m_Now;
}
#include "state.h"class LifeState : public State
{
public:LifeState(std::string content = "生活狀態(tài)");void Handle(People *people) override;
};
#include "lifestate.h"
#include "workstate.h"
#include "people.h"LifeState::LifeState(std::string content):State(content)
{}void LifeState::Handle(People *people)
{int time = people->Time();if(time > 9 && time < 18)people->ChangeState(new WorkState());
}
#include <iostream>
#include <memory>
#include "people.h"
#include "workstate.h"
#include "playstate.h"
#include "lifestate.h"using namespace std;int main()
{std::shared_ptr<State> state1 = std::make_shared<WorkState>();People p(state1.get());p.Show();p.SetTime(9);p.Show();p.SetTime(11);p.Show();p.SetTime(13);p.Show();p.SetTime(20);p.Show();p.SetTime(22);p.Show();return 0;
}
來(lái)吧,展示!
當(dāng)前狀態(tài):工作狀態(tài)
來(lái)吧,展示!
當(dāng)前狀態(tài):工作狀態(tài)
來(lái)吧,展示!
當(dāng)前狀態(tài):工作狀態(tài)
來(lái)吧,展示!
當(dāng)前狀態(tài):玩兒樂(lè)狀態(tài)
來(lái)吧,展示!
當(dāng)前狀態(tài):生活狀態(tài)
優(yōu)點(diǎn)
模式的優(yōu)點(diǎn)
-
將與特定狀態(tài)相關(guān)的行為局部化,并且將不同狀態(tài)的行為分割開(kāi)來(lái)。
將特定的狀態(tài)相關(guān)的行為都放入一個(gè)對(duì)象中,由于所有與狀態(tài)相關(guān)的代碼都存在于某個(gè)ConcreteState中,所以通過(guò)定義新的子類(lèi)可以很容易的增加新的狀態(tài)和轉(zhuǎn)換。
-
消除龐大的條件分支語(yǔ)句。
-
狀態(tài)模式通過(guò)把各種狀態(tài)轉(zhuǎn)移邏輯分布到state的子類(lèi)之間,來(lái)減少相互之間的依賴(lài)。
缺點(diǎn)
模式的缺點(diǎn)
- 每個(gè)子狀態(tài)跳轉(zhuǎn)到另外一個(gè)子狀態(tài)是固定的,不能夠靈活設(shè)置下一個(gè)狀態(tài),也就是說(shuō)狀態(tài)之間裝換最好是一對(duì)一的,否則就又會(huì)出現(xiàn)一個(gè)龐大的分支語(yǔ)句。從這點(diǎn)上來(lái)看還有點(diǎn)像職責(zé)鏈模式。
總結(jié)
以上是生活随笔為你收集整理的状态模式(c++实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。