C++ 设计模式之状态模式

C++ 设计模式之状态模式

简介

1、状态模式 (State)是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变它的行为,对象看起来似乎修改了它的类。该模式主要用于实现一个对象在多种状态转换时能够自动切换到正确的行为。

2、状态模式 (State)应用场景包括但不限于:
2.1、当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时。
2.2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

3、状态模式 (State)的构成
3.1、状态基类

class State
{
public:virtual ~State() {}virtual void handleInput(CharacterContext& context, char input) = 0;virtual void update(CharacterContext& context) = 0;
};

3.2、具体状态类

class StandingState : public State
{
public:void handleInput(CharacterContext& context, char input);void update(CharacterContext& context);
};

4、状态模式 (State)的优点
4.1、封装性:状态的变更逻辑和动作执行封装在状态对象中,易于维护和扩展。
4.2、去除庞大的条件分支语句:状态模式通过把各种状态转移逻辑分布到状态对象中,去掉了原系统中对象的行为巨大且复杂的条件分支语句。
4.3、集中化状态管理:所有状态相关的代码都存在于某个State子类中,易于理解。
4.4、维护和扩展更简单:新增状态只需增加新的状态类,不需改变已有的状态类和上下文。

5、状态模式 (State)的缺点
5.1、类膨胀:如果状态很多,而且状态的逻辑也很复杂,就可能会产生很多的状态类,导致系统变得非常庞大。
5.2、依赖性:状态模式把各种状态对象的逻辑都分布在各个状态类中,每个状态类都依赖上下文对象,这增加了各个类之间的依赖性。

简单示例

1、定义

class State
{
public:virtual ~State() {}virtual void handleInput(CharacterContext& context, char input) = 0;virtual void update(CharacterContext& context) = 0;
};class StandingState : public State
{
public:void handleInput(CharacterContext& context, char input);void update(CharacterContext& context);
};class JumpingState : public State
{
public:void handleInput(CharacterContext& context, char input);void update(CharacterContext& context);
};class DuckingState : public State
{
public:void handleInput(CharacterContext& context, char input);void update(CharacterContext& context);
};class CharacterContext
{
public:CharacterContext(State* initialState);~CharacterContext();void handleInput(char input);void changeState(State* newState);void update();
private:State* currentState;
};

2、实现

void StandingState::handleInput(CharacterContext& context, char input)
{if (input == 'D'){context.changeState(new DuckingState());}else if (input == 'J'){context.changeState(new JumpingState());}
}void StandingState::update(CharacterContext& context)
{std::cout << "Character is standing." << std::endl;
}void JumpingState::handleInput(CharacterContext& context, char input)
{if (input == 'D'){context.changeState(new DuckingState());}
}void JumpingState::update(CharacterContext& context)
{std::cout << "Character is jumping." << std::endl;
}void DuckingState::handleInput(CharacterContext& context, char input)
{if (input == 'S'){context.changeState(new StandingState());}
}void DuckingState::update(CharacterContext& context)
{std::cout << "Character is ducking." << std::endl;
}CharacterContext::CharacterContext(State* initialState) : currentState(initialState)
{}CharacterContext::~CharacterContext()
{delete currentState;
}void CharacterContext::handleInput(char input)
{currentState->handleInput(*this, input);
}void CharacterContext::changeState(State* newState)
{delete currentState;currentState = newState;
}void CharacterContext::update()
{currentState->update(*this);
}

3、调用

CharacterContext character(new StandingState());
character.handleInput('D');
character.update();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东大学计算机组成原理-期末复习纲要

考试题型&#xff1a;单选题、简答题&#xff08;如原码一位乘法运算、屏蔽技术的程序执行流程等&#xff09;、设计题&#xff08;字位扩展、指令微操作流程、cache等&#xff09;&#xff0c;作业难度、题型 课本&#xff1a;《计算机组成原理&#xff08;第三版&#xff09…

详解flink sql, calcite logical转flink logical

文章目录 背景示例FlinkLogicalCalcConverterBatchPhysicalCalcRuleStreamPhysicalCalcRule其它算子FlinkLogicalAggregateFlinkLogicalCorrelateFlinkLogicalDataStreamTableScanFlinkLogicalDistributionFlinkLogicalExpandFlinkLogicalIntermediateTableScanFlinkLogicalInt…

语音唤醒入门(基于ESP-skainet)

主要参考资料&#xff1a; ESP-SR 用户指南: https://docs.espressif.com/projects/esp-sr/zh_CN/latest/esp32s3/index.html 目录 ESP提供的模型直接初始化和使用模型AFE声学前端算法 使用模型 自定义模型 ESP提供的模型 乐鑫提供了经过训练的 WakeNet 和 MultiNet 模型&…

45.分解质因数

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/711 题目描述 给定一个整数 𝑛n,请将它…

HDFS详细介绍以及HDFS集群环境部署【hadoop组件HDFS笔记】(图片均为学习时截取的)

HDFS详细介绍 HDFS是什么 HDFS是Hadoop三大组件(HDFS、MapReduce、YARN)之一 全称是&#xff1a;Hadoop Distributed File System&#xff08;Hadoop分布式文件系统&#xff09;&#xff1b;是Hadoop技术栈内提供的分布式数据存储解决方案 可以在多台服务器上构建存储集群&…

云计算【第一阶段(21)】Linux引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…

敏捷开发笔记(第9章节)--开放-封闭原则(OCP)

目录 1&#xff1a;PDF上传链接 9.1 开放-封闭原则&#xff08;OCP&#xff09; 9.2 描述 9.3 关键是抽象 9.3.1 shape应用程序 9.3.2 违反OCP 糟糕的设计 9.3.3 遵循OCP 9.3.4 是的&#xff0c;我说谎了 9.3.5 预测变化和“贴切的”结构 9.3.6 放置吊钩 1.只受一次…

团队任务管理跟踪软件有哪些?分享2024年值得关注的10款

本文将分享2024年值得关注的10款团队任务管理跟踪软件&#xff1a;Worktile、PingCode、Zoho Projects、Wrike、ProofHub、Connecteam、MeisterTask、Nifty、BIGContacts、Hive。 无论是小型初创企业还是庞大的跨国公司&#xff0c;高效的任务管理都能显著提升工作效率&#xf…

面试框架一些小结

springcloud的⼯作原理 springcloud由以下⼏个核⼼组件构成&#xff1a; Eureka&#xff1a;各个服务启动时&#xff0c;Eureka Client都会将服务注册到Eureka Server&#xff0c;并且Eureka Client还可以反过来从Eureka Server拉取注册表&#xff0c; 从⽽知道其他服务在哪⾥ …

新能源行业知识体系-------主目录-----持续更新

本文相当于目录方便快速检索内容&#xff0c;没有实际内容&#xff0c;只做索引 文章目录 一、电力市场概论二、蒙西电网需求侧响应三、蒙西电网市场结算V2.0 一、电力市场概论 是学习清华大学电力市场概论(2024年春)的学习笔记&#xff0c;详细了解电力市场是如何利用经济学知…

48 - 按日期分组销售产品(高频 SQL 50 题基础版)

48 - 按日期分组销售产品 -- group_concat 分组拼接selectsell_date,count(distinct product) num_sold,group_concat(distinct product order by product separator ,) products fromActivities group bysell_date;

grpc教程——proto文件转go

【1】编写一个proto文件 syntax "proto3"; package myproto;service NC{rpc SayStatus (NCRequest) returns (NCResponse){} }message NCRequest{ string name 1; } message NCResponse{string status 1; } 【2】转换&#xff1a;protoc --go_out. myservice.pro…

mmdetection2.28修改backbone不使用预训练参数、从头训练

背景 最近需要测试一下在backbone部分如果不使用预训练参数的话&#xff0c;模型需要多少轮才能收敛所使用的backbone是mmcls.ConvNeXtmmdetection版本为2.28.2&#xff0c;mmcls版本为0.25.0 修改流程 最简单的方法&#xff0c;直接去mmcls的model zoo里找到对应backbone的…

SpringBoot:使用Spring Batch实现批处理任务

引言 在企业级应用中&#xff0c;批处理任务是不可或缺的一部分。它们通常用于处理大量数据&#xff0c;如数据迁移、数据清洗、生成报告等。Spring Batch是Spring框架的一部分&#xff0c;专为批处理任务设计&#xff0c;提供了简化的配置和强大的功能。本文将介绍如何使用Spr…

6-Pandas使用自定义函数

Pandas使用自定义函数 如果想要应用自定义的函数&#xff0c;或者把其他库中的函数应用到 Pandas 对象中&#xff0c;有以下三种方法&#xff1a; 1) 操作整个 DataFrame 的函数&#xff1a;pipe()2) 操作行或者列的函数&#xff1a;apply()3) 操作单一元素的函数&#xff1a…

Python 教程---面向对象编程

面向对象编程 4.1 类和对象的概念类&#xff08;Class&#xff09;对象&#xff08;Object&#xff09;示例创建和使用类 4.2 类成员实例成员类成员静态成员示例 4.3 面向对象三要素封装&#xff08;Encapsulation&#xff09;继承&#xff08;Inheritance&#xff09;多态&…

单晶层状氧化物制作方法技术资料 纳离子技术

网盘 https://pan.baidu.com/s/1hjHsXvTXG74-0fDo5TtXWQ?pwd10jk 单晶型高熵普鲁士蓝正极材料及其制备方法与应用.pdf 厘米级铬氧化物单晶及其制备方法和存储器件.pdf 多孔氧化物单晶材料及其制备方法和应用.pdf 大单晶层状氧化物正极材料及其制备方法和应用.pdf 富钠P2相层状…

docker k8s

1、docker是什么&#xff1f; 将环境和程序一起打包给到 服务器运行的工具软件。 2、基础镜像base image是什么&#xff1f; 操作系统&#xff1a;用户空间、内核空间 阉割操作系统&#xff0c;利用其的用户空间&#xff08;因为应用程序运行在用户空间&#xff09;&#xf…

量化交易之机器学习篇 - 实现K近邻模型的两种方式

# 导入相关模块import numpy as npfrom collections import Counter import matplotlib.pyplot as pltfrom sklearn import datasets from sklearn.utils import shuffledef load_data():iris datasets.load_iris()# 打乱数据后的数据和标签X, y shuffle(iris.data, iris.tar…

【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】

专栏&#xff1a;机器学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 1. 引言 线性回归&#xff08;Linear Regression&#xff09;是一种常见的统计方法和机器学习算法&a…