狀態模式:當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。
解決的問題:當控制乙個物件狀態轉換的條件表示式過於複雜,把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,把複雜的判斷邏輯簡單化。
state:抽象狀態類,定義介面以封裝與context乙個特定狀態相關的行為
conceretestate:具體狀態,每個子類實現乙個與context的乙個狀態相關的行為
context:維護concretestate子類的例項,這個例項定義當前的狀態
將特定的狀態相關的行為都放入乙個物件中,由於所有與狀態相關的**都存在於某個concretestate中,所以通過定義新的子類可以很容易地增加新的狀態和轉換
目的:消除龐大的條件分支
狀態模式通過把各種狀態轉移邏輯分布到state的子類之間,來減少相互間的依賴。
何時使用:
當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為時
main.cpp
#include #include #include "state.h"
#include "war.h"
#include "endstate.h"
using namespace std;
void process()
delete war;
war = null;
}int main(int argc,char* argv)
state.h
#ifndef state_h
#define state_h
#include class war;
class state
;#endif
state.cpp
#include "state.h"
state::state(void)
state::~state(void)
void state::prophase()
void state::metaphase()
void state::anaphase()
void state::end()
//執行當前戰爭在當前狀態下的行為
//void state::currentstate(std::shared_ptrptrwar)
void state::currentestate(war* ptrwar)
endstate.h
#ifndef endstate_h
#define endstate_h
#include #include "state.h"
//結束
class endstate :
public state
;//後期
class anaphasestate :
public state
;//中期
class metastate :
public state
;//前期
class prophasestate :
public state
;#endif
endstate.cpp
#include "endstate.h"
#include #include "war.h"
using namespace std;
endstate::endstate(void)
endstate::~endstate(void)
void endstate::end(war* ptrwar)
void endstate::currentestate(war* ptrwar)
//後期
anaphasestate::anaphasestate(void)
anaphasestate::~anaphasestate(void)
void anaphasestate::anaphase(war* ptrwar)
else }
void anaphasestate::currentestate(war* ptrwar)
//中期
metastate::metastate(void)
metastate::~metastate(void)
void metastate::metaphase(war* ptrwar)
//如果不是中期,設定進入後期階段的物件,實現物件狀態的轉換
else }
void metastate::currentestate(war* ptrwar)
//前期
prophasestate::prophasestate(void)
prophasestate::~prophasestate(void)
void prophasestate::prophase(war* ptrwar)
else }
void prophasestate::currentestate(war* ptrwar)
war.h
#ifndef war_h
#define war_h
#include //戰爭
class state;
class war
;#endif
war.cpp
#include "war.h"
#include "state.h"
//war::war(std::shared_ptrptrstate)
war::war(state* ptrstate):_ptrstate(ptrstate),_idays(0)
war::~war(void)
}int war::getdays()
void war::setdays(int idays)
//void war::setstate(std::shared_ptrptrstate)
void war::setstate(state* ptrstate)
_ptrstate = ptrstate;
}//對請求做處理,並設定下一狀態
void war::getstate()
16 設計模式 狀態模式
乙個物件想內部狀態類改變時,允許改變其行為。就是把乙個物件的狀態改到一系列狀態類中,在狀態類中控制條件判斷 狀態改變。1 將狀態的行為都封裝都狀態類中,不同的狀態不同的類。2 狀態轉化條件在狀態類中,不會出現狀態隨意變換的問題。3 可拓展性性強。狀態的越多,類越多 1 上下文 維護當前狀態。2 抽象...
16 設計模式之狀態模式
對有狀態的物件,把複雜的 邏輯判斷 提取到不同的狀態物件中,允許狀態物件在其內部狀態發生改變時改變其行為。狀態模式包含以下主要角色。抽象狀態角色 state 定義乙個介面,用以封裝環境物件中的特定狀態所對應的行為。具體狀態角色 concrete state 實現抽象狀態所對應的行為。電梯執行系統,電...
設計模式C 實現(16) 狀態模式
分類 軟體設計模式c 實現 2011 08 11 08 45 50人閱讀收藏 舉報 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式...