141 lines
2.4 KiB
C++
141 lines
2.4 KiB
C++
#include "state.hpp"
|
|
|
|
void SolidState::behavior(Water* p_water) const
|
|
{
|
|
cout << "当前状态为固态,温度为" << p_water->getTemperature() << "℃" << endl;
|
|
}
|
|
|
|
bool SolidState::isMatch(int stateInfo) const
|
|
{
|
|
return stateInfo <= 0;
|
|
}
|
|
|
|
void Liquidtate::behavior(Water* p_water) const
|
|
{
|
|
cout << "当前状态为液态,温度为" << p_water->getTemperature() << "℃" << endl;
|
|
}
|
|
|
|
bool Liquidtate::isMatch(int stateInfo) const
|
|
{
|
|
return stateInfo > 0 && stateInfo < 100;
|
|
}
|
|
|
|
void GaseousState::behavior(Water* p_water) const
|
|
{
|
|
cout << "当前状态为气态,温度为" << p_water->getTemperature() << "℃" << endl;
|
|
}
|
|
|
|
bool GaseousState::isMatch(int stateInfo) const
|
|
{
|
|
return stateInfo >= 100;
|
|
}
|
|
|
|
Water::Water()
|
|
{
|
|
addState(new SolidState("固态"));
|
|
addState(new Liquidtate("液态"));
|
|
addState(new GaseousState("气态"));
|
|
|
|
setTemperature(25);
|
|
}
|
|
|
|
int Water::getTemperature()
|
|
{
|
|
return getStateInfo();
|
|
}
|
|
|
|
void Water::setTemperature(int temperature)
|
|
{
|
|
setStateInfo(temperature);
|
|
}
|
|
|
|
void Water::riseTemperature(int step)
|
|
{
|
|
setTemperature(getTemperature() + step);
|
|
}
|
|
|
|
void Water::reduceTemperature(int step)
|
|
{
|
|
setTemperature(getTemperature() - step);
|
|
}
|
|
|
|
void Water::behavior()
|
|
{
|
|
State* p_state = getState();
|
|
p_state->behavior(this);
|
|
}
|
|
|
|
string State::getName()
|
|
{
|
|
return m_name;
|
|
}
|
|
|
|
Context::Context()
|
|
{
|
|
m_stateInfo = 0;
|
|
p_curState = nullptr;
|
|
}
|
|
|
|
Context::~Context()
|
|
{
|
|
vector<State*>::iterator iter = p_states.begin();
|
|
for (; iter != p_states.end(); iter++)
|
|
{
|
|
delete (*iter); // 释放内存
|
|
}
|
|
p_states.clear();
|
|
}
|
|
|
|
void Context::addState(State* state)
|
|
{
|
|
vector<State*>::iterator iter = find(p_states.begin(), p_states.end(), state);
|
|
if (iter == p_states.end())
|
|
{
|
|
p_states.push_back(state);
|
|
}
|
|
}
|
|
|
|
bool Context::changeState(State* state)
|
|
{
|
|
vector<State*>::iterator iter = find(p_states.begin(), p_states.end(), state);
|
|
if (iter == p_states.end())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (p_curState == nullptr)
|
|
{
|
|
cout << "初始化为 " << state->getName() << endl;
|
|
}
|
|
else
|
|
{
|
|
cout << "由 " << p_curState->getName() << " 变为 " << state->getName() << endl;
|
|
}
|
|
p_curState = state;
|
|
return true;
|
|
}
|
|
|
|
State* Context::getState()
|
|
{
|
|
return p_curState;
|
|
}
|
|
|
|
void Context::setStateInfo(int stateInfo)
|
|
{
|
|
m_stateInfo = stateInfo;
|
|
for (vector<State*>::iterator iter = p_states.begin(); iter != p_states.end(); iter++)
|
|
{
|
|
if ((*iter)->isMatch(stateInfo))
|
|
{
|
|
changeState((*iter));
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
int Context::getStateInfo()
|
|
{
|
|
return m_stateInfo;
|
|
}
|