23种设计模式之状态模式(行为型,9 State,c++实现)
#include <iostream>
#include <string>
using namespace std;
class Worker;
class State
{
public:
virtual void doSomething(Worker* worker) = 0;
};
class Worker
{
public:
Worker();
void doSomething()
{
currentState->doSomething(this);
}
void setHour(int hour)
{
this->hour = hour;
}
int getHour()
{
return this->hour;
}
void setCurrentState(State* state)
{
this->currentState = state;
}
State* getCurrentState()
{
return currentState;
}
private:
int hour;
State* currentState;
};
class StateWork : public State
{
public:
virtual void doSomething(Worker* worker);
};
class StateBreakfast : public State
{
public:
virtual void doSomething(Worker* worker);
};
void StateBreakfast::doSomething(Worker* worker)
{
if (worker->getHour() >= 8 && worker->getHour() < 9)
{
cout << "eat breakfast" << endl;
}
else if (worker->getHour() >= 9 && worker->getHour() < 11)
{
delete worker->getCurrentState();
worker->setCurrentState(new StateWork());
worker->getCurrentState()->doSomething(worker);
}
}
void StateWork :: doSomething(Worker* worker)
{
if (worker->getHour() >= 9 && worker->getHour() < 11)
{
cout << "work" << endl;
}
else if (worker->getHour() >= 8 && worker->getHour() < 9)
{
delete worker->getCurrentState();
worker->setCurrentState(new StateBreakfast);
worker->getCurrentState()->doSomething(worker);
}
}
Worker::Worker()
{
setCurrentState(new StateBreakfast);
}
void main()
{
Worker* worker = new Worker();
worker->setHour(8);
worker->doSomething();
worker->setHour(10);
worker->doSomething();
delete worker;
}