状态模式--当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,可考虑用到状态模式。
// state.cpp : 定义控制台应用程序的入口点。
#include<iostream>
using namespace std;
class Work;
class State
{
public:
virtual void work(Work &w)//上面的前置声明,这里才可以用
{
cout << "State::work" << endl;
}
};
class Work
{
public:
Work();
void setState(State*s)
{
if(this->s)
{
//不要释放错了
delete this->s;
}
this->s = s;
}
void setTime(int time)
{
this->time = time;
}
void goOn()
{
if(s)
{
s->work(*this);
}
}
~Work()
{
if(s)
{
//要释放
delete s;
s = NULL;
}
}
int time;
State *s;
};
class ConcreteState4:public State
{
public:
virtual void work(Work &w)
{
cout << "时间不早了该下班了" << endl;
}
};
class ConcreteState3:public State
{
public:
virtual void work(Work &w)
{
if(w.time <18)
{
cout << "下午也要努力工作" << endl;
}
else
{
w.setState(new ConcreteState4());
//这个方法要调用
w.goOn();
}
}
};
class ConcreteState2:public State
{
public:
virtual void work(Work &w)
{
if(w.time <13)
{
cout << "午间休息下" << endl;
}
else
{
w.setState(new ConcreteState3());
w.goOn();
}
}
};
class ConcreteState1:public State
{
public:
virtual void work(Work &w)
{
if(w.time <10)
{
cout << "精神很好,努力工作" << endl;
}
else
{
w.setState(new ConcreteState2());
w.goOn();
}
}
};
class ConcreteState0:public State
{
public:
virtual void work(Work &w)
{
if(w.time <9)
{
cout << "还早呢,在睡觉" << endl;
}
else
{
w.setState(new ConcreteState1());
w.goOn();
}
}
};
//方法实现在这里,就可以使用ConcreteState0了
Work::Work()
{
this->time = 0;
this->s = new ConcreteState0();
}
int main()
{
Work w;
//要先设置
w.setTime(6);
w.goOn();
w.setTime(9);
w.goOn();
w.setTime(12);
w.goOn();
w.setTime(15);
w.goOn();
w.setTime(18);
w.goOn();
return 0;
}
状态模式的问题就是很难看到整个的状态逻辑图,代码维护起来有问题。