tionerState * GetNormalTemperatureState();
//获取制冷状态
AirConditionerState * GetRefrigerateState();
//获取制热状态
AirConditionerState * GetHeatState();
//保持常温
void KeepNormalTemperature();
//制冷
void refrigerate();
//制热
void Heat();
};
空调类实现代码如下:
//构造函数
AirConditioner::AirConditioner(string strAirName, int nTemperature)
{
m_strAirName = strAirName;
m_nTemperature = nTemperature;
m_pNormalTemperatureState = new NormalTemperatureState();
m_pRefrigerateState = new RefrigerateState();
m_pHeatState = new HeatState();
m_pCurState = m_pNormalTemperatureState;
}
//虚构函数
AirConditioner::~AirConditioner()
{
delete m_pNormalTemperatureState;
m_pNormalTemperatureState = NULL;
delete m_pRefrigerateState;
m_pRefrigerateState = NULL;
delete m_pHeatState;
m_pHeatState = NULL;
}
//调节温度
void AirConditioner::SetTemperature(int nTemperature)
{
m_nTemperature = nTemperature;
}
//获取温度
int AirConditioner::GetTemperature()
{
return m_nTemperature;
}
//设置空调状态
void AirConditioner::SetAirConditionerState(AirConditionerState * pAirConditionerState)
{
m_pCurState = pAirConditionerState;
}
//获取常温状态
AirConditionerState * AirConditioner::GetNormalTemperatureState()
{
return m_pNormalTemperatureState;
}
//获取制冷状态
AirConditionerState * AirConditioner::GetRefrigerateState()
{
return m_pRefrigerateState;
}
//获取制热状态
AirConditionerState * AirConditioner::GetHeatState()
{
return m_pHeatState;
}
//保持常温
void AirConditioner::KeepNormalTemperature()
{
m_pCurState->KeepNormalTemperature(this);
}
//制冷
void AirConditioner::refrigerate()
{
m_pCurState->refrigerate(this);
}
//制热
void AirConditioner::Heat()
{
m_pCurState->Heat(this);
}
测试代码实现如下:
#include
#include "AirConditioner.h"
using namespace std;
int main()
{
AirConditioner * pAirConditioner = new AirConditioner("海尔空调", 25);
/****************常温状态*************************/
pAirConditioner->KeepNormalTemperature();
cout << endl;
/****************制冷状态*************************/
pAirConditioner->SetTemperature(33);
pAirConditioner->refrigerate();
cout << endl;
/****************制热状态*************************/
pAirConditioner->SetTemperature(15);
pAirConditioner->Heat();
/****************销毁操作*************************/
delete pAirConditioner;
pAirConditioner = NULL;
return 0;
}
编译并执行,结果如下:

将具体行为封装在常温状态、制冷状态、制热状态中。空调类(也就是环境类)维持一个当前状态的引用,当客户端调用环境类的方法时,将该调用操作委托给具体状态类。具体状态类实现该状态下的行为,以及控制切换到其他状态。客户端无需直接操作具体的状态类,而是由环境类代为处理,降低了客户端与具体状态类的耦合性。如果需要添加具体的状态类也很容易,只需要继承于抽象状态类并对环境类稍加修改就可以了。另外,也避免了大量if...else臃肿语句,把这些条件判断都封装成一个个状态类。