Files
design-pattern-template/src/state.cpp

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;
}