当前位置: 首页 > news >正文

设计模式之状态模式(State)的C++实现

1、状态模式的提出

在组件功能开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这类问题。状态模式是将状态值抽象成一个基类,将不同状态下的操作,封装成基类中的虚函数,使用者可以依赖抽象的基类来进行功能开发。

2、需求描述

一年有不同节日,不同的节日穿不同的衣服,吃不同的食物。节日可能会随着人们的生活习俗不断地增加。设计一个根据不同地节日,返回对应穿着和食物方面的功能代码。

3、状态模式的代码实现

(1)UML图如下:

(2)代码实现如下:

#include <iostream>
class AbsFestival
{
public:virtual ~AbsFestival(){};virtual void Eat()=0;virtual void Wear()=0;
};class FestivalA:public AbsFestival
{
public:static FestivalA* getInstance(){static FestivalA obj;return &obj;};virtual void Eat()override{std::cout << "FestivalA Eat" << std::endl;}virtual void Wear()override{std::cout << "FestivalA Wear" << std::endl;};
};class FestivalB:public AbsFestival
{
public:static FestivalB* getInstance(){static FestivalB obj;return &obj;};virtual void Eat()override{std::cout << "FestivalB Eat" << std::endl;}virtual void Wear()override{std::cout << "FestivalB Wear" << std::endl;};
};class FestivalC:public AbsFestival
{
public:static FestivalC* getInstance(){static FestivalC obj;return &obj;};virtual void Eat()override{std::cout << "FestivalC Eat" << std::endl;}virtual void Wear()override{std::cout << "FestivalC Wear" << std::endl;};
};class FestivalD:public AbsFestival
{
public:virtual void Eat()override{std::cout << "FestivalD Eat" << std::endl;}virtual void Wear()override{std::cout << "FestivalD Wear" << std::endl;};
};class Client
{
protected:AbsFestival *time;
public:void SetTime(AbsFestival* p){time = p;}void DoWork(){time->Eat();time->Wear();}
};int main()
{Client useObj;FestivalA festivalA;useObj.SetTime(festivalA.getInstance());useObj.DoWork();FestivalB festivalB;useObj.SetTime(festivalB.getInstance());useObj.DoWork();FestivalC festivalC;useObj.SetTime(festivalC.getInstance());useObj.DoWork();FestivalD* festivalD = new FestivalD();useObj.SetTime(festivalD);useObj.DoWork();delete festivalD;festivalD = nullptr;return 0;
}

 程序运行结果如下:

http://www.lryc.cn/news/131415.html

相关文章:

  • 无涯教程-TensorFlow - Keras
  • 使用SSH隧道将Ubuntu云服务器Jupyter Notebook端口映射到本地
  • Keepalived+LVS部署高可用集群
  • 2023河南萌新联赛第(五)场:郑州轻工业大学
  • 在Orangepi5开发板3588s使用opencv获取摄像头画面
  • 音视频 ffmpeg命令分类查询
  • VSCode无法从Extensions下载工具时,把工具下载到本地并添加到VSCode编辑器
  • WebStrom 前端项目Debug
  • 【ARM Linux 系统稳定性分析入门及渐进12 -- GDB内存查看命令 “x“(examine)】
  • kube-prometheus 系列1 项目介绍
  • 深度学习在组织病理学图像分析中的应用: Python实现和代码解析
  • kotlin的列表
  • PCL 三维点云边界提取(C++详细过程版)
  • ../../ 目录遍历
  • clickhouse集群部署
  • centos8 使用phpstudy安装tomcat部署web项目
  • 爬虫百度返回“百度安全验证”终极解决方案
  • visual studio 2022配置
  • B-树和B+树的区别
  • c注册cpp回调函数
  • 批量将excel中字段为“八百”替换成“九百”
  • 关于docker-compose up -d在文件下无法运行的原因以及解决方法
  • 机器学习笔记 - 基于keras + 小型Xception网络进行图像分类
  • 【Unity每日一记】SceneManager场景资源动态加载
  • 自动驾驶数据回传需求
  • 使用Jmeter自带recorder代理服务器录制接口脚本
  • 我和 TiDB 的故事 | 远近高低各不同
  • 深入浅出Pytorch函数——torch.nn.init.zeros_
  • Jenkins-发送邮件配置
  • 网络通信原理传输层TCP三次建立连接(第四十八课)