//构造函数
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臃肿语句,把这些条件判断都封装成一个个状态类。