設計模式—狀態模式(十二)

        軟件領域中的設計模式的重要性不言而喻。設計模式中運用了面向對象編程語言的重要特性:封裝、繼承、多態。雖然知道這些特性的定義但是並沒有做到真正的理解,這樣特性有什麼作用?用於什麼場合中等等問題,帶着疑問開始學習設計模式,主要參考《大話設計模式》和《設計模式:可複用面向對象軟件的基礎》兩本書。

        狀態模式(State):當一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲時,可考慮用到狀態模式。

        狀態模式的優點與用處:

        將與特定狀態相關的行爲局部化,並且將不同的狀態行爲分割開來;就是將特定狀態相關的行爲都放入一個對象中,由於所有與狀態相關的代碼都存在於某個ConcreteState中,所以通過定義新的子類可以很容易地增加新的狀態和轉換。狀態模式通過把各種狀態轉移邏輯分佈到State的子類之間,來減少耦合性;

什麼時候考慮使用設計模式:當一個對象取決於它的狀態,並且它必須在運行時刻根據狀態改變他的行爲時,他就可以考慮使用狀態模式了。


#include <iostream>
using namespace std;
class Work;
class State
{
public:
	virtual void WriteProgram(Work* w) = 0;
};

class Work
{
private:
	State* current;
public:
	double hour;
public:
	Work();
	void SetState(State* temp)
	{
		current = temp;
	}
	void Writeprogram()
	{
		current->WriteProgram(this);
	}

};

class EvenState :public State
{
public:
	virtual void WriteProgram(Work* w)
	{
		if ((w->hour) < 18)
			cout << "馬上快下班了" << endl;
		else
			cout << "是時候回家了" << endl;
	}
};
class NoonState : public State
{
public:
	virtual void WriteProgram(Work* w)
	{
		if ((w->hour) < 14)
			cout << "目前還不困,在幹一會" << endl;
		else
		{
			w->SetState(new EvenState());//重新設置狀態
			w->Writeprogram();//重新調用Writeprogram()
		}
	}
};

class ForenoonState : public State
{
public:
	virtual void WriteProgram(Work* w)
	{
		if ((w->hour)<12)
			cout << "上午的精神很好" << endl;
		else
		{
			w->SetState(new NoonState()); // 重新設置狀態
			w->Writeprogram(); //重新調用Writeprogram()
		}
	}
};

Work::Work()
{
	current = new ForenoonState();
}

//客戶端:
int main()
{
	Work* mywork = new Work();
	mywork->hour = 9;
	mywork->Writeprogram();
	mywork->hour = 13;
	mywork->Writeprogram();
	mywork->hour = 15;
	mywork->Writeprogram();
	mywork->hour = 19;
	mywork->Writeprogram();
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章