生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现 ——状态模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
軟件領(lǐng)域中的設(shè)計(jì)模式為開(kāi)發(fā)人員提供了一種使用專(zhuān)家設(shè)計(jì)經(jīng)驗(yàn)的有效途徑。設(shè)計(jì)模式中運(yùn)用了面向?qū)ο缶幊陶Z(yǔ)言的重要特性:封裝、繼承、多態(tài),真正領(lǐng)悟設(shè)計(jì)模式的精髓是可能一個(gè)漫長(zhǎng)的過(guò)程,需要大量實(shí)踐經(jīng)驗(yàn)的積累。最近看設(shè)計(jì)模式的書(shū),對(duì)于每個(gè)模式,用C++寫(xiě)了個(gè)小例子,加深一下理解。主要參考《大話(huà)設(shè)計(jì)模式》和《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》兩本書(shū)。本文介紹狀態(tài)模式的實(shí)現(xiàn)。
? ? ? ?狀態(tài)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它的類(lèi)。它有兩種使用情況:(1)一個(gè)對(duì)象的行為取決于它的狀態(tài), 并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為。(2)一個(gè)操作中含有龐大的多分支的條件語(yǔ)句,且這些分支依賴(lài)于該對(duì)象的狀態(tài)。本文的例子為第一種情況,以戰(zhàn)爭(zhēng)為例,假設(shè)一場(chǎng)戰(zhàn)爭(zhēng)需經(jīng)歷四個(gè)階段:前期、中期、后期、結(jié)束。當(dāng)戰(zhàn)爭(zhēng)處于不同的階段,戰(zhàn)爭(zhēng)的行為是不一樣的,也就說(shuō)戰(zhàn)爭(zhēng)的行為取決于所處的階段,而且隨著時(shí)間的推進(jìn)是動(dòng)態(tài)變化的。下面給出相應(yīng)的UML圖。
? ? ? ?實(shí)現(xiàn)的代碼比較簡(jiǎn)單,給出War類(lèi)和State類(lèi),War類(lèi)中含State對(duì)象(指針形式)。
[cpp]?view plaincopyprint?
class?War;?? class?State??? {?? public:?? ????virtual?void?Prophase()?{}?? ????virtual?void?Metaphase()?{}?? ????virtual?void?Anaphase()?{}?? ????virtual?void?End()?{}?? ????virtual?void?CurrentState(War?*war)?{}?? };?? ?? class?War?? {?? private:?? ????State?*m_state;???? ????int?m_days;???????? public:?? ????War(State?*state):?m_state(state),?m_days(0)?{}?? ????~War()?{?delete?m_state;?}?? ????int?GetDays()?{?return?m_days;?}?? ????void?SetDays(int?days)?{?m_days?=?days;?}?? ????void?SetState(State?*state)?{?delete?m_state;?m_state?=?state;?}?? ????void?GetState()?{?m_state->CurrentState(this);?}?? };??
? ? ? ? ? ?給出具體的狀態(tài)類(lèi):
[cpp]?view plaincopyprint?
?? class?EndState:?public?State?? {?? public:?? ????void?End(War?*war)??? ????{?? ????????cout<<"戰(zhàn)爭(zhēng)結(jié)束"<<endl;?? ????}?? ????void?CurrentState(War?*war)?{?End(war);?}?? };?? ?? class?AnaphaseState:?public?State?? {?? public:?? ????void?Anaphase(War?*war)??? ????{?? ????????if(war->GetDays()?<?30)?? ????????????cout<<"第"<<war->GetDays()<<"天:戰(zhàn)爭(zhēng)后期,雙方拼死一搏"<<endl;?? ????????else?? ????????{?? ????????????war->SetState(new?EndState());?? ????????????war->GetState();?? ????????}?? ????}?? ????void?CurrentState(War?*war)?{?Anaphase(war);?}?? };?? ?? class?MetaphaseState:?public?State?? {?? public:?? ????void?Metaphase(War?*war)??? ????{?? ????????if(war->GetDays()?<?20)?? ????????????cout<<"第"<<war->GetDays()<<"天:戰(zhàn)爭(zhēng)中期,進(jìn)入相持階段,雙發(fā)各有損耗"<<endl;?? ????????else?? ????????{?? ????????????war->SetState(new?AnaphaseState());?? ????????????war->GetState();?? ????????}?? ????}?? ????void?CurrentState(War?*war)?{?Metaphase(war);?}?? };?? ?? class?ProphaseState:?public?State?? {?? public:?? ????void?Prophase(War?*war)???? ????{?? ????????if(war->GetDays()?<?10)?? ????????????cout<<"第"<<war->GetDays()<<"天:戰(zhàn)爭(zhēng)初期,雙方你來(lái)我往,互相試探對(duì)方"<<endl;?? ????????else?? ????????{?? ????????????war->SetState(new?MetaphaseState());?? ????????????war->GetState();?? ????????}?? ????}?? ????void?CurrentState(War?*war)?{?Prophase(war);?}?? };??
? ? ? ? ?使用方式:
[cpp]?view plaincopyprint?
?? int?main()?? {?? ????War?*war?=?new?War(new?ProphaseState());?? ????for(int?i?=?1;?i?<?40;i?+=?5)?? ????{?? ????????war->SetDays(i);?? ????????war->GetState();?? ????}?? ????delete?war;?? ????return?0;?? }??
? ? ?本人享有博客文章的版權(quán),轉(zhuǎn)載請(qǐng)標(biāo)明出處?http://blog.csdn.net/wuzhekai1985
總結(jié)
以上是生活随笔為你收集整理的设计模式C++实现 ——状态模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。