設計模式(C 實現)(九) 狀態模式

2021-09-23 17:19:00 字數 2938 閱讀 8609

籃球運動員在比賽的時候,會因為體力、情緒等影響競技狀態。比如,剛上場的時候,體力充沛、動作靈活、投籃神準;打了8分鐘過後,身體疲憊、動作變慢;下場休息3分鐘並喝了一瓶紅牛過後,體力恢復、恢復了運動能力和投籃手感;最後決勝3分鐘,比分犬牙交錯,肌肉緊張、身體匹配、精神興奮。編寫程式,描述各個狀態下,運動員的情況。

如果建立乙個籃球運動員類,在該類中實現乙個展示運動員情況的函式,則該函式需要實現不同狀態下籃球運動員情況,則該函式內容過多,如果出現新的情況,修改該函式帶來較多風險。如何避免?能否將不同狀態下,運動員的情況從運動員類中剝離出來,做到**的責任分解?

state.h

在該檔案中實現了狀態的基類istate,及其子類cgamebeginstate(比賽剛開始的狀態)、cafter8minstate(打了8分鐘之後的狀態)、crestanddrinkstate(下場休息3分鐘並喝了一瓶紅牛之後的狀態)、clast3minstate(最後決勝3分鐘的狀態)。還有運動員類cbasketballplayer。將運動員在不同狀態的情況,分離出來,在狀態類中實現,且將狀態的判斷在子類實現。

#pragma once

#include /*籃球運動員在比賽的時候,會因為體力、情緒等影響競技狀態。

比如,剛上場的時候,體力充沛、動作靈活、投籃神準;

打了8分鐘過後,身體疲憊、動作變慢;

下場休息3分鐘並喝了一瓶紅牛過後,體力恢復、恢復了運動能力和投籃手感;

最後決勝3分鐘,比分犬牙交錯,肌肉緊張、身體匹配、精神興奮。

編寫程式,描述各個狀態下,運動員的情況。*/

class cbasketballplayer;

//狀態基類

class istate

virtual ~istate()

virtual void showability(cbasketballplayer* pbasketballplayer) = 0;

istate* m_pstate;

};//比賽剛開始的狀態

class cgamebeginstate : public istate

;//打了8分鐘之後的狀態

class cafter8minstate : public istate

;//下場休息3分鐘並喝了一瓶紅牛之後的狀態

class crestanddrinkstate : public istate

;//最後決勝3分鐘的狀態

class clast3minstate : public istate

;//籃球運動員

class cbasketballplayer

virtual ~cbasketballplayer() }

void settime(int itime)

int gettime()

void setstate(istate* pstate)

void play() }

private:

int m_itime;

istate* m_pstate;

};

state.cpp

#include "state.h"

cgamebeginstate::cgamebeginstate()

cgamebeginstate::~cgamebeginstate()

}void cgamebeginstate::showability(cbasketballplayer* pbasketballplayer)

if (pbasketballplayer->gettime() < 8)

else }

cafter8minstate::cafter8minstate()

cafter8minstate::~cafter8minstate()

}void cafter8minstate::showability(cbasketballplayer* pbasketballplayer)

else }

crestanddrinkstate::crestanddrinkstate()

crestanddrinkstate::~crestanddrinkstate()

}void crestanddrinkstate::showability(cbasketballplayer* pbasketballplayer)

else }

clast3minstate::clast3minstate()

clast3minstate::~clast3minstate()

void clast3minstate::showability(cbasketballplayer* pbasketballplayer)

else

}

main.cpp

//#include "state.h"

int main()

執行結果

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

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

狀態模式的好處是將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。將特定的狀態相關的行為都放入乙個物件中,由於所有與狀態相關的**都存在於某個concretestate中,所以通過定義新的子類可以很容易地增加新的狀態和轉換。

狀態模式消除了龐大的條件分支語句,把各個狀態轉移邏輯分部到state的子類之間,來減少互相間的依賴。

當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行為,且它的狀態較多,判斷複雜時就可以考慮使用狀態模式了。

返回目錄:設計模式(c++實現)(總)

設計模式C 實現(16) 狀態模式

分類 軟體設計模式c 實現 2011 08 11 08 45 50人閱讀收藏 舉報 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式...

設計模式C 實現(16) 狀態模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

設計模式C 實現(16) 狀態模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...