狀態模式 state C 實現

2021-09-24 12:28:43 字數 2166 閱讀 7702

狀態模式:當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了這個類

狀態模式的主要解決的是,當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。當然,如果這個狀態判斷邏輯很簡單,就沒有必要使用狀態模式

這裡對於簡單邏輯判斷和複雜邏輯判斷,大家可以自己考慮,注意

1.當狀態數目不是很多的時候,switch/case可能可以搞定。但是當狀態數目很多的時候(實際系統中也正是如此),維護一大組的switch/case語句將是一件異常困難並且容易出錯的事情。

2.狀態邏輯和動作實現沒有分離。在很多的系統實現中,動作的實現**直接寫在狀態的邏輯當中。這帶來的後果就是系統的擴充套件性和維護得不到保證。

角色角色作用

角色成員

state

用來實現每種狀態的具體行為

乙個行為介面用於與context狀態相關

state1

繼承state狀態

實現乙個具體行為……

…context

維護乙個具體state狀態例項,這個例項是當前狀態

request介面,用來呼叫state中行為介面,以及changestate介面

#ifndef include_context_h_

#define include_context_h_

class context;

class state \\抽象狀態類

protected:

state(){}

};class context \\contexte類要維護乙個具體state類的例項,這個例項定義當前的狀態

void request();

void changestate(state* state);

};class statea : public state

~statea(){}

virtual void handle(context* pcontext);

};class stateb : public state

~stateb(){}

virtual void handle(context* pcontext);

};class statec : public state

~statec(){}

virtual void handle(context* pcontext);

};#endif /* include_context_h_ */

#include"context.h"

#includevoid context::request()

void context::changestate(state* state)

void statea::handle(context* pcontext)

void stateb::handle(context* pcontext)

//執行該狀態的行為並改變狀態

void statec::handle(context* pcontext)

#include"context.h"

#includevoid context::request()

void context::changestate(state* state)

void statea::handle(context* pcontext)

void stateb::handle(context* pcontext)

void statec::handle(context* pcontext)

#include#include"context.h"

using namespace std;

int main()

statea

stateb

stateb

statea

stateb

自己可以加入很多功能;

將特定的狀態相關的行為都封裝在乙個物件中,由於所有與狀態相關的**都存在於乙個具體的state中,所以定義新的子類很容易增加新的狀態和轉換。

說白了,為了消除龐大的條件分支語句。符合設計模式。

狀態模式 C 實現

狀態模式 定義 允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。實用性 1 乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為。2 乙個操作中含有龐大的多分支條件語句,且這些分支依賴於該物件的狀態。優點 1 將與特定狀態相關的行為區域性化,並且將不同狀態的...

狀態模式 java實現

工作時,上午狀態好 中午想睡覺 加班苦煎熬 其實這是一種狀態的變化 不同的時間 會有不同的狀態 public classwork1else if hour 13 else if hour 17 elseelseelseelse 超過12點,則進入中午工作狀態 w.setstate newnoonst...

狀態模式(C 實現)

本部落格旨在個人總結回顧 狀態模式 允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎改變了它所屬的類。說明 主要解決 物件的行為依賴於它的狀態 屬性 並且可以根據它的狀態改變而改變它的相關行為。優點 封裝了轉換規則。列舉可能的狀態,在列舉狀態之前需要確定狀態種類。將所有與某個狀態有關的行為...