C++設計形式之狀況形式。本站提示廣大學習愛好者:(C++設計形式之狀況形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之狀況形式正文
媒介
在現實開辟中,我們常常會碰到這類情形;一個對象有多種狀況,在每個狀況下,都邑有分歧的行動。那末在代碼中我們常常是如許完成的。
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
}
}
而這類就比如簡略工場形式,當我們增長新的狀況類型時,我們又須要修正本來的代碼,這類關於測試是很晦氣的;因為簡略工場的缺陷那末的顯著,後來的工場形式就戰勝了這個缺陷,我們便可以自創工程形式,來處理這類跟著狀況增長而湧現的多分支構造,而這就是我明天要總結的狀況形式。
狀況形式
在GOF的《設計形式:可復用面向對象軟件的基本》一書中對狀況形式是如許說的:許可一個對象在其外部狀況轉變時轉變它的行動。對象看起來仿佛修正了它的類。狀況形式的重點在於狀況轉換,許多時刻,關於一個對象的狀況,我們都是讓這個對象包括一個狀況的屬性,這個狀況屬性記載著對象的詳細狀況,依據狀況的分歧應用分支構造來履行分歧的功效,就像下面的代碼那樣處置;就像下面說的,類中存在年夜量的構造相似的分支語句,變得難以保護和懂得。狀況形式清除了分支語句,就像工場形式清除了簡略工場形式的分支語句一樣,將狀況處置疏散到各個狀況子類中去,每一個子類集中處置一種狀況,如許就使得狀況的處置和轉換清楚明白。
UML類圖
Context:界說客戶端感興致的接口,而且保護一個ConcreteState子類的實例,這個實例界說以後狀況;
State:界說一個接口以封裝與Context的一個特定狀況相干的行動;
ConcreteState subclasses:每個子類完成一個與Context的一個狀況相干的行動。
它們之間的協作步調以下:
1.Context將與狀況相干的要求拜托給以後的ConcreteState對象處置;
2.Context可以將本身作為一個參數傳遞給處置該要求的狀況對象。這使得狀況對象在需要時可以拜訪Context;
3.Context是客戶應用的重要接口。客戶可用狀況對象來設置裝備擺設一個Context,一旦一個Context設置裝備擺設終了,它的客戶不再須要直接與狀況對象打交道;
應用場所
在以下兩種情形下都可應用State形式:
1.一個對象的行動取決於它的狀況,而且它必需在運轉時辰依據狀況轉變它的行動;
2.一個操作中含有宏大的多分支的前提語句,且這些分支依附於該對象的狀況。這個狀況平日用一個或多個列舉常量表現。平日有多個操作包括這一雷同的前提構造。State形式將每個前提分支放入一個自力的類中。這使得你可以依據對象本身的情形將對象的狀況作為一個對象,這一對象可以不依附於其它對象而自力變更。
代碼完成:
#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;
}
總結
狀況形式總的來講長短常好懂得的;沒有何等深邃的時序關系,就是簡略的將對象的狀況和對應狀況下的行動分別開來,不再是簡略的if…else或switch…case分支構造了,而是每個狀況都對應一個類,一個類集中治理一個狀況;在多狀況的情形下,簡化了法式的保護和治理,讓法式構造簡明化,同時也易於擴大。