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

Linux C++ 055-设计模式之状态模式

Linux C++ 055-设计模式之状态模式

本节关键字:Linux、C++、设计模式、状态模式
相关库函数:

概念

状态模式(State Pattern)是设计模式的一种,属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。

优缺点

优点

1、封装状态转换规则:将状态转换逻辑封装在状态对象内部。
2、易于扩展:增加新的状态类不会影响现有代码。
3、集中状态相关行为:将所有与特定状态相关的行为集中到一个类中。
4、简化条件语句:避免使用大量的条件语句来切换行为。
5、状态共享:允许多个上下文对象共享同一个状态对象。

缺点

1、增加类和对象数量:每个状态都需要一个具体的状态类。
2、实现复杂:模式结构和实现相对复杂。
3、开闭原则支持不足:增加新状态或修改状态行为可能需要修改现有代码。

使用场景

1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2、一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

当对象的行为随状态改变而变化时,考虑使用状态模式。状态模式适用于替代复杂的条件或分支语句。

角色说明

状态模式包含以下几个主要角色:

上下文(Context):定义了客户感兴趣的接口,并维护一个当前状态对象的引用。上下文可以通过状态对象来委托处理状态相关的行为。

状态(State):定义了一个接口,用于封装与上下文相关的一个状态的行为。

具体状态(Concrete State):实现了状态接口,负责处理与该状态相关的行为。具体状态对象通常会在内部维护一个对上下文对象的引用,以便根据不同的条件切换到不同的状态。

代码示例

//头文件
#include <iostream>
using namespace std;class Context;
// 抽象出来的状态类
class State
{
public:/* 抽象的接口,每个子类去实现这个接口根据自己的逻辑执行任务或者转换状态。*/virtual void Handle(Context *context) = 0;// 获得当前的状态virtual void GetState() = 0;
};// 状态管理类
class Context
{
public:// 初始化状态Context(State *state) {m_pState = state;}// 获得当前的状态State* GetState() {return m_pState;}// 改变当前的状态void SetState(State *state){m_pState = state;}// 执行状态类实现的方法void Request() {m_pState->Handle(this);}State* m_pState;
};
// 具体的状态子类
class ConcreteStateA:public State
{
public:void Handle(Context *context);void GetState();
};
// 具体的状态子类
class ConcreteStateB:public State
{
public:void Handle(Context *context);void GetState();
};
// 具体的状态子类
class ConcreteStateC:public State
{
public:void Handle(Context *context);void GetState();
};// cpp文件
#include "StateMode.h"
void ConcreteStateA:: Handle(Context *context)
{context->m_pState = new ConcreteStateB;cout<<"当前状态是A,下一状态是B"<<endl;
}
void ConcreteStateB:: Handle(Context *context)
{context->m_pState = new ConcreteStateC;cout<<"当前状态是B,下一状态是C"<<endl;
}
void ConcreteStateC:: Handle(Context *context)
{context->m_pState = new ConcreteStateA;cout<<"当前状态是C,下一状态是A"<<endl;
}
void ConcreteStateA:: GetState()
{cout<<"当前状态是A"<<endl;
}
void ConcreteStateB:: GetState()
{cout<<"当前状态是B"<<endl;
}
void ConcreteStateC:: GetState()
{cout<<"当前状态是B"<<endl;
}
int main(int argc, char *argv[])
{// 初始化A状态Context* context = new Context(new ConcreteStateA);context->Request();context->Request();context->Request();getchar();return 0;
}

相关文章:

Linux C++ 055-设计模式之状态模式

Linux C 055-设计模式之状态模式 本节关键字&#xff1a;Linux、C、设计模式、状态模式 相关库函数&#xff1a; 概念 状态模式&#xff08;State Pattern&#xff09;是设计模式的一种&#xff0c;属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似…...

景联文科技构建高质量心理学系知识图谱,助力大模型成为心理学科专家

心理大模型正处于快速发展阶段&#xff0c;在临床应用、教育、研究等多个领域展现出巨大潜力。 心理学系知识图谱能够丰富心理大模型的认知能力&#xff0c;使其在处理心理学相关问题时更加精确、可靠和有洞察力。这对于提高心理健康服务的质量和效率、促进科学研究以及优化教育…...

【数学建模】——数学规划模型

目录 一、线性规划&#xff08;Linear Programming&#xff09; 1.1 线性规划的基本概念 1.2 线性规划的图解法 模型建立&#xff1a; 二、整数规划&#xff08;Integer Programming&#xff09; 2.1 整数规划的基本概念 2.2 整数规划的求解方法 三、非线性规划&#x…...

卸载linux 磁盘的内容,磁盘占满

Linux清理磁盘 https://www.cnblogs.com/siyunianhua/p/17981758 当前文件夹下&#xff0c;数量 ls -l | grep "^-" | wc -l ls -lR | grep "^-" | wc -l 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找…...

LeetCode-随机链表的复制

. - 力扣&#xff08;LeetCode&#xff09; 本题思路&#xff1a; 首先注意到随机链表含有random的指针&#xff0c;这个random指针指向是随机的&#xff1b;先一个一个节点的拷贝&#xff0c;并且把拷贝的节点放在拷贝对象的后面&#xff0c;再让拷贝节点的next指向原链表拷贝…...

axios 下载大文件时,展示下载进度的组件封装——js技能提升

之前面试的时候&#xff0c;有遇到一个问题&#xff1a;就是下载大文件的时候&#xff0c;如何得知下载进度&#xff0c;当时的回复是没有处理过。。。 现在想到了。axios中本身就有一个下载进度的方法&#xff0c;可以直接拿来使用。 下面记录一下处理步骤&#xff1a; 参考…...

Linux: network: device事件注册机制 chatGPT; notify

ChatGPT 在 Linux 内核中,有关网络设备(net-device)的事件注册机制,允许用户在网络设备的状态发生变化(例如设备被删除、添加或修改)时接收通知。这主要通过 netdev 事件通知机制实现。具体来说,内核提供了一组用于注册和处理网络设备事件的 API。 以下是一些关键组件…...

【ROS2】测试

为什么要进行自动化测试&#xff1f; 以下是我们应该进行自动化测试的许多重要原因之一&#xff1a; 您可以更快地对代码进行增量更新。ROS 有数百个包&#xff0c;具有许多相互依赖关系&#xff0c;因此很难预见一个小变化可能引起的问题。如果您的更改通过了单元测试&#xf…...

别卷模型,卷应用:从李彦宏的AI观点谈起

2024年7月4日&#xff0c;世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心隆重召开。百度创始人、董事长兼首席执行官李彦宏在产业发展主论坛上的发言&#xff0c;引起了广泛关注。他提出&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这一观点…...

数据库(Database,简称DB)介绍

数据库&#xff08;Database&#xff0c;简称DB&#xff09;是信息技术领域中一个至关重要的组成部分&#xff0c;它按照数据结构来组织、存储和管理数据。以下是对数据库的详细介绍&#xff1a; 一、定义与基本概念 定义&#xff1a;数据库是按照数据结构来组织、存储和管理…...

Redis五种常用数据类型详解及使用场景

Redis 5 种基本数据类型 Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类型…...

Postman API测试覆盖率:全面评估指南

&#x1f4ca; Postman API测试覆盖率&#xff1a;全面评估指南 在API测试中&#xff0c;测试覆盖率是一个关键指标&#xff0c;它衡量了测试用例对代码的覆盖程度。Postman提供了多种工具和方法来评估API测试覆盖率&#xff0c;帮助开发者和测试人员确保API的质量和稳定性。本…...

C++--find

find 在[first,last)区间找第一个等于val的元素。 template<class InputIterator, class T> InputIterator find(InputIterator first,//起始迭代器 InputIterator last, //结束迭代器 const T& val); //需要查找的值 源码剖析 template<class InputI…...

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识&#xff0c;我们可以告一段落了。下面呢&#xff0c;我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例&#xff0c;是基于Spring官方提供的骨架实现的。 Sprin…...

mysql命令练习

创建数据表grade: CREATE TABLE grade( id INT NOT NULL&#xff0c; sex CHAR(1)&#xff0c; firstname VARCHAR(20) NOT NULL&#xff0c; lastname VARCHAR(20) NOT NULL&#xff0c; english FLOAT&#xff0c; math FLOAT, chinese FLOAT )&#xff1b; 向数据表grade中插…...

AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程

大家好&#xff0c;我是设计师阿威 想要入门 AI 绘画&#xff0c;首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了&#xff0c;但在那时&#xff0c;生成的图像分辨率和内容都非常抽象。 直到近两年&#xff0c;AI 产出的图像…...

jenkins添加ssh证书

1、生成ssh密匙&#xff1a;windows生成ssh密匙-CSDN博客 2、添加添加ssh凭证&#xff1a;jenkins路由地址为&#xff1a;/manage/credentials/store/system/domain/_/ 点击添加凭证 选择第二个&#xff0c;将生成的私匙 id_rsa 里边的内容赋值到密钥&#xff0c;id留空自动…...

C++--accumulate介绍

在C中&#xff0c;accumulate是一个用于对容器中的元素进行累加操作的函数模板&#xff0c;位于 头文件中。它允许你对容器&#xff08;如vector或array&#xff09;中的元素进行累加运算&#xff0c;并返回累加的结果。 源代码展示 template<class InputIterator, class …...

C++写一个线程池

C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池&#xff0c;详情请见&#xff1a; C语言写一个线程池 这次换成C了&#xff01;…...

【SASS/SCSS(一)】选择器

Sass 是一门高于 CSS 的元语言&#xff0c;它能用来清晰地、结构化地描述文件样式。 而SCSS是SASS引入的语法&#xff0c;是CSS的超集&#xff0c;所以所有CSS有效的使用在SCSS中都生效 一、回顾CSS选择器 通用选择器 *元素选择器类选择器&#xff0c;.classNameID选择器&am…...

详细解析Kafaka Streams中各个DSL操作符的用法

什么是DSL&#xff1f; 在Kafka Streams中&#xff0c;DSL&#xff08;Domain Specific Language&#xff09;指的是一组专门用于处理Kafka中数据流的高级抽象和操作符。这些操作符以声明性的方式定义了数据流的转换、聚合、连接等处理逻辑&#xff0c;使得开发者可以更加专注…...

C++中链表的底层迭代器实现

大家都知道在C的学习中迭代器是必不可少的&#xff0c;今天我们学习的是C中的链表的底层迭代器的实现&#xff0c;首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别&#xff0c;为什么顺序表的底层迭代器更加容易实现&#xff0c;而链表的底层迭代器…...

3.5、matlab打开显示保存点云文件(.ply/.pcd)以及经典点云模型数据

1、点云数据简介 点云数据是三维空间中由大量二维点坐标组成的数据集合。每个点代表空间中的一个坐标点&#xff0c;可以包含有关该点的颜色、法向量、强度值等额外信息。点云数据可以通过激光扫描、结构光扫描、摄像机捕捉等方式获取&#xff0c;广泛应用于计算机视觉、机器人…...

Qt-事件与信号

事件和信号的区别在于&#xff0c;事件通常是由窗口系统或应用程序产生的&#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装&#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…...

数据结构 day3

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…...

Kubernetes面试整理-如何进行滚动更新和回滚?

在 Kubernetes 中,滚动更新和回滚是管理应用程序版本的常用操作。滚动更新允许您逐步替换现有的 Pod 实例,以便在不中断服务的情况下部署新版本。回滚则是在新版本出现问题时恢复到之前的版本。 滚动更新 通过 Deployment 进行滚动更新 1. 创建一个 Deployment: 下面是一个…...

flutter ios打包 xcode报错module ‘xxx‘ not found

flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode&#xff0c;重新打开ios/Runner.xcworkspace/文件。然后重新archive&#xff…...

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)

概述 在先前探讨的文章中&#xff0c;我们构建了一个全面的数据测试体系&#xff0c;该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板&#xff0c;以直观展现分析结果&#xff0c;正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…...

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…...

【Pytorch笔记】张量

torch.Tensor() 是 PyTorch 库中用于创建张量的一个函数。在 PyTorch 中&#xff0c;张量是多维数组&#xff0c;它们可以存储在 CPU 或 GPU 上&#xff0c;并且支持自动求导&#xff0c;这使得它们非常适合进行深度学习和科学计算。 张量可以在Python list形式下通过 torch.T…...

宁乡电商网站建设收费/steam交易链接在哪复制

前言&#xff1a;对应分析法可以揭示同一变量的各个类别之间的差异&#xff0c;以及不同变量各个类别之间的对应关系。对应分析实际也是“降维”方法的一种&#xff0c;它比较适合对分类变量进行研究。 对应分析的基本思想是将一个联列表的行和列中各元素的比例结构以点的形式…...

注册网站名字/什么是seo教程

1、POJO&#xff1a; POJO&#xff08;Plain Ordinary Java Object&#xff09;简单的Java对象&#xff0c;实际就是普通JavaBeans&#xff0c;是为了避免和EJB混淆所创造的简称。 使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接。其中有一些属性及其getter setter方法…...

网站推广合作/广州网络科技有限公司

最近用虚拟机安装了centos7&#xff0c;但发现用yum install nginx 命令来安装nginx提示找不到相关的包&#xff0c;最后到nginx官网上找到了解决办法 步骤&#xff1a; cd /etc/yum.repos.d/然后建立 nginx.repo 文件 vi nginx.repo输入以下内容&#xff1a; [nginx] nameng…...

python做的网站/天津谷歌优化

第一种 # 安装mysql:5.7,直接docker run 他会自动去官方镜想下载 # MYSQL_ROOT_PASSWORD[的数据库密码&#xff0c;此处写的是123456 # -d 表示容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)&#xff1b;使用 -d 参数启动后…...

外贸网站建设熊掌号/外贸推广是做什么的

ViewPager指针项目&#xff0c;在使用ViewPager的时候能够指示ViewPager所在的位置&#xff0c;就像Google Play中切换的效果一样&#xff0c;还能使用在应用初始化的介绍页面1. 引入ViewPagerIndicator库2. 编写布局文件<com.viewpagerindicator.TabPageIndicatorandroid:i…...

网站建设专/网站做优化

游戏任务剧情布局系统分析&#xff1a; 任务系统分主线任务、日常任务和悬赏任务&#xff1a; 主线任务的特点&#xff1a;“所有任务分成N条主线&#xff0c;每条主线上一个任务完成了&#xff0c;即使不领奖也可以完成下一个任务&#xff0c;每条线没有尽头”&#xff1b; 日…...