設計モードC++実装(16)状態モード

2821 ワード

ソフトウェア分野の設計モデルは、開発者に専門家の設計経験を使用する有効な方法を提供します.設計モードの中で対象向けプログラミング言語の重要な特性を運用した:パッケージ、継承、多態、本当に設計モードの精髄を悟るのは1つの長い過程であり、大量の実践経験の蓄積が必要である.最近デザインモードの本を読んで、各モードについて、C++で小さな例を書いて、理解を深めました.主に『大話設計モード』と『設計モード:オブジェクト向けソフトウェアを多重化できる基礎』の2冊を参考にします.本稿では,状態モードの実装について述べる.
≪ステータス・モード|Status Mode|emdw≫:オブジェクトが内部のステータスが変更されたときに動作を変更できるようにします.オブジェクトはクラスを変更したように見えます.(1)1つのオブジェクトの動作はその状態に依存し、実行時に状態に応じて動作を変更する必要があります.(2)1つの動作には膨大な複数のブランチの条件文が含まれており、これらのブランチはそのオブジェクトの状態に依存する.本文の例は第1の情況で、戦争を例にして、1度の戦争が4つの段階を経験する必要があると仮定します:前期、中期、後期、終わり.戦争が異なる段階にあると、戦争の行為は異なり、つまり戦争の行為は置かれている段階に依存し、時間の推進に伴って動的に変化するという.次に、対応するUML図を示す.
http://blog.csdn.net/wuzhekai1985/article/details/6675799
実装されるコードは比較的簡単で,WarクラスとStateクラスを与え,WarクラスにはStateオブジェクト(ポインタ形式)が含まれている.
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); }
};

 
//    
class EndState: public State
{
public:
	void End(War *war) //         
	{
		cout<<"    "<<endl;
	}
	void CurrentState(War *war) { End(war); }
};
//  
class AnaphaseState: public State
{
public:
	void Anaphase(War *war) //       
	{
		if(war->GetDays() < 30)
			cout<<" "<<war->GetDays()<<" :    ,      "<<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()<<" :    ,      ,      "<<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()<<" :    ,      ,      "<<endl;
		else
		{
			war->SetState(new MetaphaseState());
			war->GetState();
		}
	}
	void CurrentState(War *war) { Prophase(war); }
};

 
//    
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;
}