#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::iterator iter = p_states.begin(); for (; iter != p_states.end(); iter++) { delete (*iter); // 释放内存 } p_states.clear(); } void Context::addState(State* state) { vector::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::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::iterator iter = p_states.begin(); iter != p_states.end(); iter++) { if ((*iter)->isMatch(stateInfo)) { changeState((*iter)); break; } } } int Context::getStateInfo() { return m_stateInfo; }