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