生活随笔
收集整理的這篇文章主要介紹了
                                
状态模式(c++实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            狀態模式
 
模式定義
 
狀態模式(state),當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
 
模式動機
 
- 狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過于復雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的判斷邏輯簡化。
- 當一個對象的行為取決于它的狀態,并且它必須在運行時根據狀態改變它的行為時,就可以考慮使用狀態模式了。
UML類圖
 
 
源碼實現
 
#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 << "來吧,展示!" << std::endl;std::cout << "當前狀態:" << 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 = "生活狀態");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;
} 
 來吧,展示!
 當前狀態:工作狀態
 來吧,展示!
 當前狀態:工作狀態
 來吧,展示!
 當前狀態:工作狀態
 來吧,展示!
 當前狀態:玩兒樂狀態
 來吧,展示!
 當前狀態:生活狀態
 
 
優點
 
模式的優點
 
-  將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。 將特定的狀態相關的行為都放入一個對象中,由于所有與狀態相關的代碼都存在于某個ConcreteState中,所以通過定義新的子類可以很容易的增加新的狀態和轉換。 
-  消除龐大的條件分支語句。 
-  狀態模式通過把各種狀態轉移邏輯分布到state的子類之間,來減少相互之間的依賴。 
缺點
 
模式的缺點
 
- 每個子狀態跳轉到另外一個子狀態是固定的,不能夠靈活設置下一個狀態,也就是說狀態之間裝換最好是一對一的,否則就又會出現一個龐大的分支語句。從這點上來看還有點像職責鏈模式。
總結
                            
                                以上是生活随笔為你收集整理的状态模式(c++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。