欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

C++設(shè)計(jì)模式之狀態(tài)模式

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

前言

在實(shí)際開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到這種情況;一個(gè)對(duì)象有多種狀態(tài),在每一個(gè)狀態(tài)下,都會(huì)有不同的行為。那么在代碼中我們經(jīng)常是這樣實(shí)現(xiàn)的。

復(fù)制代碼 代碼如下:

typedef enum tagState
{
     state,
     state1,
     state2
}State;
 
void Action(State actionState)
{
     if (actionState == state)
     {
          // DoSomething
     }
     else if (actionState == state1)
     {
          // DoSomething
     }
     else if (actionState == state2)
     {
          // DoSomething
     }
     else
     {
          // DoSomething
     }
}

而這種就好比簡(jiǎn)單工廠模式,當(dāng)我們?cè)黾有碌臓顟B(tài)類(lèi)型時(shí),我們又需要修改原來(lái)的代碼,這種對(duì)于測(cè)試是很不利的;由于簡(jiǎn)單工廠的缺點(diǎn)那么的明顯,后來(lái)的工廠模式就克服了這個(gè)缺點(diǎn),我們就可以借鑒工程模式,來(lái)解決這種隨著狀態(tài)增加而出現(xiàn)的多分支結(jié)構(gòu),而這就是我今天要總結(jié)的狀態(tài)模式。

狀態(tài)模式

在GOF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書(shū)中對(duì)狀態(tài)模式是這樣說(shuō)的:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。對(duì)象看起來(lái)似乎修改了它的類(lèi)。狀態(tài)模式的重點(diǎn)在于狀態(tài)轉(zhuǎn)換,很多時(shí)候,對(duì)于一個(gè)對(duì)象的狀態(tài),我們都是讓這個(gè)對(duì)象包含一個(gè)狀態(tài)的屬性,這個(gè)狀態(tài)屬性記錄著對(duì)象的具體狀態(tài),根據(jù)狀態(tài)的不同使用分支結(jié)構(gòu)來(lái)執(zhí)行不同的功能,就像上面的代碼那樣處理;就像上面說(shuō)的,類(lèi)中存在大量的結(jié)構(gòu)類(lèi)似的分支語(yǔ)句,變得難以維護(hù)和理解。狀態(tài)模式消除了分支語(yǔ)句,就像工廠模式消除了簡(jiǎn)單工廠模式的分支語(yǔ)句一樣,將狀態(tài)處理分散到各個(gè)狀態(tài)子類(lèi)中去,每個(gè)子類(lèi)集中處理一種狀態(tài),這樣就使得狀態(tài)的處理和轉(zhuǎn)換清晰明確。

UML類(lèi)圖

Context:定義客戶端感興趣的接口,并且維護(hù)一個(gè)ConcreteState子類(lèi)的實(shí)例,這個(gè)實(shí)例定義當(dāng)前狀態(tài);
State:定義一個(gè)接口以封裝與Context的一個(gè)特定狀態(tài)相關(guān)的行為;
ConcreteState subclasses:每一個(gè)子類(lèi)實(shí)現(xiàn)一個(gè)與Context的一個(gè)狀態(tài)相關(guān)的行為。

它們之間的協(xié)作步驟如下:

1.Context將與狀態(tài)相關(guān)的請(qǐng)求委托給當(dāng)前的ConcreteState對(duì)象處理;
2.Context可以將自身作為一個(gè)參數(shù)傳遞給處理該請(qǐng)求的狀態(tài)對(duì)象。這使得狀態(tài)對(duì)象在必要時(shí)可以訪問(wèn)Context;
3.Context是客戶使用的主要接口??蛻艨捎脿顟B(tài)對(duì)象來(lái)配置一個(gè)Context,一旦一個(gè)Context配置完畢,它的客戶不再需要直接與狀態(tài)對(duì)象打交道;

使用場(chǎng)合

在以下兩種情況下均可使用State模式:

1.一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為;
2.一個(gè)操作中含有龐大的多分支的條件語(yǔ)句,且這些分支依賴于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量表示。通常有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。State模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類(lèi)中。這使得你可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其它對(duì)象而獨(dú)立變化。

代碼實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

#include <iostream>
using namespace std;
 
class Context;
 
class State
{
public:
     virtual void Handle(Context *pContext) = 0;
};
 
class ConcreteStateA : public State
{
public:
     virtual void Handle(Context *pContext)
     {
          cout<<"I am concretestateA."<<endl;
     }
};
 
class ConcreteStateB : public State
{
public:
     virtual void Handle(Context *pContext)
     {
          cout<<"I am concretestateB."<<endl;
     }
};
 
class Context
{
public:
     Context(State *pState) : m_pState(pState){}
 
     void Request()
     {
          if (m_pState)
          {
               m_pState->Handle(this);
          }
     }
 
     void ChangeState(State *pState)
     {
          m_pState = pState;
     }
 
private:
     State *m_pState;
};
 
int main()
{
     State *pStateA = new ConcreteStateA();
     State *pStateB = new ConcreteStateB();
     Context *pContext = new Context(pStateA);
     pContext->Request();
 
     pContext->ChangeState(pStateB);
     pContext->Request();
 
     delete pContext;
     delete pStateB;
     delete pStateA;
}

總結(jié)

狀態(tài)模式總的來(lái)說(shuō)是非常好理解的;沒(méi)有多么深?yuàn)W的時(shí)序關(guān)系,就是簡(jiǎn)單的將對(duì)象的狀態(tài)和對(duì)應(yīng)狀態(tài)下的行為分離開(kāi)來(lái),不再是簡(jiǎn)單的if…else或switch…case分支結(jié)構(gòu)了,而是每一個(gè)狀態(tài)都對(duì)應(yīng)一個(gè)類(lèi),一個(gè)類(lèi)集中管理一個(gè)狀態(tài);在多狀態(tài)的情況下,簡(jiǎn)化了程序的維護(hù)和管理,讓程序結(jié)構(gòu)簡(jiǎn)明化,同時(shí)也易于擴(kuò)展。

上一篇:C++實(shí)現(xiàn)下載的代碼

欄    目:C語(yǔ)言

下一篇:C++設(shè)計(jì)模式之訪問(wèn)者模式

本文標(biāo)題:C++設(shè)計(jì)模式之狀態(tài)模式

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3286.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有