2、智能空调的设计与实现

某软件公司将开发一套智能空调系统: 系统检測到温度处于20---30度之间,则切换到常温状态;温度处于30---45度,则切换到制冷状态; 温度小于20度,则切换到制热状态。

请使用状态模式对此系统进行设计。

从需求中能够看出。空调能够处于三种状态: 制热状态、常温状态、制冷状态。每种状态下都存在三种行为:保持常温、制冷、制热。

空调抽象状态实现代码例如以下:

//空调抽象状态类
class AirConditionerState
{
public:
//保持常温
virtual void KeepNormalTemperature(AirConditioner * pAirConditioner) = 0; //制冷
virtual void refrigerate(AirConditioner * pAirConditioner) = 0; //制热
virtual void Heat(AirConditioner * pAirConditioner) = 0;
};

三种详细状态类声明例如以下:

//常温状态
class NormalTemperatureState : public AirConditionerState
{
public:
//保持常温
void KeepNormalTemperature(AirConditioner * pAirConditioner); //制冷
void refrigerate(AirConditioner * pAirConditioner); //制热
void Heat(AirConditioner * pAirConditioner);
}; //制冷状态
class RefrigerateState : public AirConditionerState
{
public:
//保持常温
void KeepNormalTemperature(AirConditioner * pAirConditioner); //制冷
void refrigerate(AirConditioner * pAirConditioner); //制热
void Heat(AirConditioner * pAirConditioner);
}; //制热状态
class HeatState : public AirConditionerState
{
public:
//保持常温
void KeepNormalTemperature(AirConditioner * pAirConditioner); //制冷
void refrigerate(AirConditioner * pAirConditioner); //制热
void Heat(AirConditioner * pAirConditioner);
};

每种状态下都存在保持常温、制冷、制热方法。这些方法带有一个AirConditioner类參数,方法内部使用这个參数回调空调的温度值,依据这个温度值。用于推断该方法怎样实现。以及怎样切换到其它状态。三种状态实现代码例如以下:

/******************************正常温度状态******************************************/

//保持常温
void NormalTemperatureState::KeepNormalTemperature(AirConditioner * pAirConditioner)
{ int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature > 20 && nTemperature <= 30 )
{
cout << "已经是常温状态。不能调节为常温" << endl;
}
} //制冷
void NormalTemperatureState::refrigerate(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature > 30 && nTemperature <= 45 )
{
pAirConditioner->SetAirConditionerState(pAirConditioner->GetRefrigerateState()); cout << "切换到制冷状态" << endl;
}
} //制热
void NormalTemperatureState::Heat(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature <= 20 )
{
pAirConditioner->SetAirConditionerState(pAirConditioner->GetHeatState()); cout << "切换到制热状态" << endl;
}
} /******************************制冷状态******************************************/ //保持常温
void RefrigerateState::KeepNormalTemperature(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature > 20 && nTemperature <= 30 )
{
pAirConditioner->SetAirConditionerState(pAirConditioner->GetNormalTemperatureState()); cout << "切换到常温状态" << endl;
}
} //制冷
void RefrigerateState::refrigerate(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature > 30 && nTemperature <= 45 )
{
cout << "已经是制冷状态,不能调节为制冷状态" << endl;
}
} //制热
void RefrigerateState::Heat(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature <= 20 )
{
pAirConditioner->SetAirConditionerState(pAirConditioner->GetHeatState()); cout << "切换到制热状态" << endl;
}
} /******************************制热状态******************************************/ //保持常温
void HeatState::KeepNormalTemperature(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature > 20 && nTemperature <= 30 )
{
pAirConditioner->SetAirConditionerState(pAirConditioner->GetNormalTemperatureState()); cout << "切换到常温状态" << endl;
}
} //制冷
void HeatState::refrigerate(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature > 30 && nTemperature <= 45 )
{
pAirConditioner->SetAirConditionerState(pAirConditioner->GetRefrigerateState()); cout << "切换到制冷状态" << endl;
}
} //制热
void HeatState::Heat(AirConditioner * pAirConditioner)
{
int nTemperature = pAirConditioner->GetTemperature(); if( nTemperature <= 20 )
{
cout << "已经是制热状态,不能调节为制热状态" << endl;
}
}

空调类。也就是环境类Contex,维护了一个状态的引用,实现的时候将调用状态对象的方法。声明代码例如以下:

//空调类
class AirConditioner
{
private:
//空调名称
string m_strAirName; //空调当前温度
int m_nTemperature; //常温状态
AirConditionerState * m_pNormalTemperatureState; //制冷状态
AirConditionerState * m_pRefrigerateState; //制热状态
AirConditionerState * m_pHeatState; //当前温度状态
AirConditionerState * m_pCurState;
public:
//构造函数
AirConditioner(string strAirName, int nTemperature); //虚构函数
~AirConditioner(); //调节温度
void SetTemperature(int nTemperature); //获取温度
int GetTemperature(); //设置空调状态
void SetAirConditionerState(AirConditionerState * pAirConditionerState); //获取常温状态
AirConditionerState * 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 <iostream>
#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;
}

编译并运行,结果例如以下:



    将详细行为封装在常温状态、制冷状态、制热状态中。

空调类(也就是环境类)维持一个当前状态的引用,当client调用环境类的方法时,将该调用操作托付给详细状态类。详细状态类实现该状态下的行为,以及控制切换到其它状态。client无需直接操作详细的状态类,而是由环境类代为处理。减少了client与详细状态类的耦合性。假设须要加入详细的状态类也非常easy,仅仅须要继承于抽象状态类并对环境类稍加改动就能够了。另外。也避免了大量if...else臃肿语句。把这些条件推断都封装成一个个状态类。

C++设计模式之状态模式(二)的更多相关文章

  1. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  2. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  6. js设计模式——5.状态模式

    js设计模式——5.状态模式 代码演示 /*js设计模式——状态模式*/ // 状态(红灯,黄灯,绿灯) class State { constructor(color) { this.color = ...

  7. 设计模式2——状态模式State

    参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...

  8. python设计模式之状态模式

    python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...

  9. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

随机推荐

  1. windows10+arch linux双系统 uefi启动

    安装前的准备Archlinux 安装ISO镜像,下载:http://mirrors.163.com/archlinux/iso/2013.05.01/U盘一个,最好1G以上,格式化成FAT32.把下载 ...

  2. POJ 1111(数字很吉利嘛) 简单BFS

    Image Perimeters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8594 Accepted: 5145 Desc ...

  3. indeed 4.22 第一次网测

    1.第一题 没有看 2. 由于数据范围很小,所以每一层需要全排列,寻找最小的花费,然后所有层加起来就是最后的结果. #include<bits/stdc++.h> #define pb p ...

  4. 使用IDEA 搭建一个SpringBoot + Hibernate + Gradle

    ---恢复内容开始--- 打开IDEA创建一个新项目: 第一步: 第二步: 第三步: 最后一步: 如果下载的时候时间太久.可以找到build.gradle文件,添加以下代码.如下图 maven{ ur ...

  5. 【Oracle】详解10053事件

    借助Oracle的10053事件event,我们可以监控到CBO对SQL进行成本计算和路径选择的过程和方法. 10053事件有两个级别: Level 2:2级是1级的一个子集,它包含以下内容: Col ...

  6. (转)基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

    http://www.cnblogs.com/wuhuacong/p/4093778.html 在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界 ...

  7. 微信小程序开发常用方法

    1.函数中访问data中的数据 _this.setData({ // 日历数据 signList: dataList, // 当前日期 todayDay: str }) 2.if判断 wx:if=&q ...

  8. Python【每日一问】35

    问: 基础题: 从键盘输入4个数字,各数字采用空格分隔,对应为变量x0,y0,x1,y1.计算(x0,y0)和(x1,y1)两点之间的距离,输出结果保留1位小数. 比如,键盘输入:0 1 3 5,屏幕 ...

  9. BZOJ 1984月下“毛景树” LCT维护边权 + 下传标记

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...

  10. atcoder.keyence2019.contest E-Connecting Cities

    真是道好题啊,当时怎么想都没想出来... 传送门 简述题意: 有n个点,每个点有一个权值Ai,连接i,j两个点的代价是 |i−j|×D+Ai+Aj  其中D是给定的常数,问把n个点联通的最小代价 1≤ ...