设计模式—状态模式(十二)

        软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。

        状态模式(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;
}


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