#include <iostream>
#include <string>
#include<map>
using namespace std;
class Work;
class State;
enum STATE_NAME{
WEEK_1,
WEEK_2,
WEEK_3,
WEEK_4,
WEEK_5,
WEEK_6,
WEEK_7,
WEEK_8
};
class State
{
public:
State()
{
}
public:
virtual void writeProgram(Work*)=0;
};
class Work
{
public:
Work();
void writeProgram()
{
if(nullptr != m_pcurrent)
m_pcurrent->writeProgram(this);
}
void setState(State *temp_current)
{
m_pcurrent = temp_current;
}
State *getState()
{
return m_pcurrent;
}
void setCurrentStateValue(STATE_NAME state_value)
{
m_current_State_value = state_value;
}
STATE_NAME getCurrentStateValue()
{
return m_current_State_value;
}
private:
STATE_NAME m_current_State_value = STATE_NAME::WEEK_8;
private:
State *m_pcurrent = nullptr;
};
class WEEK_1_State:public State
{
public:
WEEK_1_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期一,工作安排如下!"<<endl;
cout<<"喝酒1!"<<endl;
cout<<"吃饭1!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_2);
}
};
class WEEK_2_State:public State
{
public:
WEEK_2_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期二,工作安排如下!"<<endl;
cout<<"喝酒2!"<<endl;
cout<<"吃饭2!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_3);
}
};
class WEEK_3_State:public State
{
public:
WEEK_3_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期三,工作安排如下!"<<endl;
cout<<"喝酒3!"<<endl;
cout<<"吃饭3!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_4);
}
};
class WEEK_4_State:public State
{
public:
WEEK_4_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期四,工作安排如下!"<<endl;
cout<<"喝酒4!"<<endl;
cout<<"吃饭4!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_5);
}
};
class WEEK_5_State:public State
{
public:
WEEK_5_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期五,工作安排如下!"<<endl;
cout<<"喝酒5!"<<endl;
cout<<"吃饭5!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_6);
}
};
class WEEK_6_State:public State
{
public:
WEEK_6_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期六,工作安排如下!"<<endl;
cout<<"喝酒6!"<<endl;
cout<<"吃饭6!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_7);
}
};
class WEEK_7_State:public State
{
public:
WEEK_7_State()
{
}
void writeProgram(Work *w)
{
cout<<"今日星期日,工作安排如下!"<<endl;
cout<<"喝酒7!"<<endl;
cout<<"吃饭7!"<<endl;
w->setCurrentStateValue(STATE_NAME::WEEK_8);
}
};
Work::Work()
{
m_current_State_value = STATE_NAME::WEEK_1;
}
int main()
{
std::map<STATE_NAME,State*> state_map;
state_map.insert(make_pair(WEEK_1,new WEEK_1_State()));
state_map.insert(make_pair(WEEK_2,new WEEK_2_State()));
state_map.insert(make_pair(WEEK_3,new WEEK_3_State()));
state_map.insert(make_pair(WEEK_4,new WEEK_4_State()));
state_map.insert(make_pair(WEEK_5,new WEEK_5_State()));
state_map.insert(make_pair(WEEK_6,new WEEK_6_State()));
state_map.insert(make_pair(WEEK_7,new WEEK_7_State()));
Work *w=new Work();
w->setState(state_map.find(STATE_NAME::WEEK_1)->second);
while(1)
{
w->writeProgram();
auto it = state_map.find(w->getCurrentStateValue());
if(it != state_map.end())
w->setState(it->second);
else
w->setState(nullptr);
}
return 0;
}
C++状态机模式实例
于 2023-03-24 20:01:03 首次发布