状态模式(State Pattern)

定义

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。这意味着,当对象的状态发生变化时,它的行为也会发生变化。状态模式特别适用于行为依赖于其状态的对象,而且当这些状态可以独立于对象的其他部分进行变化时。

在状态模式中,我们定义一个Context类和一个State接口,以及多个实现了State接口的ConcreteState类。Context类持有一个State对象的引用,并委托给这个State对象来处理行为。当Context的状态改变时,它会切换到新的State对象。

示例

下面是一个C++的状态模式示例,其中有一个Context类(StateContext),一个State接口(State),以及两个实现了State接口的ConcreteState类(StateAStateB):

#include <iostream>  // State 接口  
class State {  
public:  virtual void handle(StateContext* context) = 0;  
};  // ConcreteStateA  
class StateA : public State {  
public:  void handle(StateContext* context) override {  std::cout << "处理 A 状态的行为" << std::endl;  context->setState(new StateB()); // 切换到下一个状态  }  
};  // ConcreteStateB  
class StateB : public State {  
public:  void handle(StateContext* context) override {  std::cout << "处理 B 状态的行为" << std::endl;  // 这里可以根据需要决定是否切换到其他状态  }  
};  // StateContext  
class StateContext {  
private:  State* state;  public:  StateContext() : state(new StateA()) {}  void setState(State* newState) {  delete state; // 释放旧状态  state = newState;  }  void request() {  state->handle(this);  }  
};  int main() {  StateContext context;  context.request(); // 处理 A 状态的行为,然后切换到 B 状态  context.request(); // 处理 B 状态的行为  return 0;  
}

解释:

  1. State 是一个接口,定义了所有状态类应该具有的行为。在这个例子中,它只有一个handle方法,用于处理状态的行为。
  2. StateA 和 StateB 是实现了 State 接口的具体状态类。它们分别定义了在不同状态下应该如何处理行为。在 StateA 的 handle 方法中,它首先处理 A 状态的行为,然后切换到 StateB。在 StateB 的 handle 方法中,它只处理 B 状态的行为。
  3. StateContext 是一个上下文类,它持有一个 State 对象的引用,并有一个 request 方法用于触发状态的行为。在 request 方法中,它委托给当前状态对象来处理行为。此外,StateContext 还有一个 setState 方法用于设置新的状态对象。
  4. 在 main 函数中,我们创建了一个 StateContext 对象,并调用了两次 request 方法。第一次调用时,由于初始状态是 StateA,所以会处理 A 状态的行为,并切换到 StateB。第二次调用时,当前状态是 StateB,所以只会处理 B 状态的行为。

这个示例展示了如何使用状态模式来根据对象的状态改变其行为。在实际应用中,状态模式可以用于实现各种需要根据状态变化来改变行为的场景,例如用户界面的状态变化、网络请求的状态变化等。

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

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

相关文章

学习pybind11:Hello World例子

首先要明白pybind11是干啥的&#xff0c;对于一个C/C库&#xff0c;可以用pybind11封装它的接口为Python接口&#xff0c;这样得到一个python库&#xff0c;就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此&#xff0c;使用pybind11做封装&#xff0c;是我…

分享便携式血氧仪单片机方案

血氧仪主要测量指标分别为脉率、血氧饱和度、灌注指数。血氧饱和度是临床医疗上重要的基础数据之一。以家用指压式血氧仪为例&#xff0c;一个血氧仪一般由MCU、存储芯片、两个控制LED的数模转换器、两个发光二极管驱动等组成。 灵动微电子的MM32MCU产品已被广泛地应用在了一些…

代码随想录算法训练营第44天|● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

文章目录 ● 完全背包卡码网&#xff1a;52. 携带研究材料-完全背包理论练习代码&#xff1a; ● 518. 零钱兑换 II思路&#xff1a;五部曲 代码&#xff1a;滚动数组代码二&#xff1a;二维数组 ● 377. 组合总和 Ⅳ思路&#xff1a;五部曲 代码&#xff1a; ● 完全背包 卡码…

LeetCode 2621.睡眠函数

请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1&#xff1a; 输入&#xff1a;millis 100 输出&#xff1a;100 解释&#xff1a; 在 100ms 后此异步函数执行完时返回一个 Promise 对象 …

Bert-as-service 学习

pip3 install --user --upgrade tensorflow 安装遇到的问题如下&#xff1a; pip3 install --user --upgrade tensorflow 1052 pip uninstall protobuf 1053 pip3 uninstall protobuf 1054 pip3 install protobuf3.20.* 1055 pip3 install open-clip-torch2.8.2 1…

C#单向链表实现:Append,Move,Delete,InsertAscending, InsertUnAscending,Clear

目录 一、链表定义 二、链表设计 1.先定义一个结点类&#xff08;Node&#xff09; 2.再定义链表类&#xff08;LinkedList&#xff09;并依次设计其方法 3.再实现删除方法 4.再实现Insert 的方法 5.再增加InsertAscending升序插入 6.再增加 InsertUnAscending 的方法…

数据库CLOB类型

CLOB&#xff08;Character Large Object&#xff09;是一种数据库字段类型&#xff0c;通常用于存储大量的字符数据&#xff0c;如文本、日志、XML 数据等。 在数据库中&#xff0c;CLOB 类型可以存储比普通字符串类型更大的数据量&#xff0c;通常用于保存超过数据库限制长度…

如何选择科技公司或者技术团队来开发软件项目呢

最近有客户问我们为什么同样软件项目不同公司报价和工期差异很大&#xff0c;我们给他解释好久才讲清楚&#xff0c;今天整理一下打算写一篇文章来总结一下&#xff0c;有需要开发朋友可以参考&#xff0c;我们下次遇到客户也可以直接转发文章给客户自己看。 我们根据我们自己报…

EMR StarRocks实战——Mysql数据实时同步到SR

文章摘抄阿里云EMR上的StarRocks实践&#xff1a;《基于实时计算Flink使用CTAS&CDAS功能同步MySQL数据至StarRocks》 前言 CTAS可以实现单表的结构和数据同步&#xff0c;CDAS可以实现整库同步或者同一库中的多表结构和数据同步。下文主要介绍如何使用Flink平台和E-MapRed…

未来智能:嵌入式系统的创新应用

未来智能&#xff1a;嵌入式系统的创新应用 随着科技的不断进步和智能化的发展&#xff0c;嵌入式系统在各个领域都有着广泛的应用。未来&#xff0c;嵌入式系统将在智能化、自动化、物联网等方面发挥越来越重要的作用。以下将从几个创新应用方面论述嵌入式系统在未来智能领域…

jvm常用参数配置

一、 常用参数 -Xms JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时&#xff0c;JVM会减小heap的大小到-Xms指定的大小&#xff0c;可通过-XX:MaxHeapFreeRation来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同…

Java SpringBoot微服务面试题

Java SpringBoot微服务面试题 前言1、什么是 SpringBoot&#xff1f;2、什么是起步依赖&#xff1f;3、什么是自动配置&#xff1f;4、什么是命令行界面&#xff1f;5、什么是Actuator监控器&#xff1f;6、SpringBoot 的核心注解有哪些&#xff1f;7、什么是YAML&#xff1f;8…

Leetcoder Day26| 回溯part06:总结+三道hard题

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

[C++]使用C++部署yolov9的tensorrt模型进行目标检测

部署YOLOv9的TensorRT模型进行目标检测是一个涉及多个步骤的过程&#xff0c;主要包括准备环境、模型转换、编写代码和模型推理。 首先&#xff0c;确保你的开发环境已安装了NVIDIA的TensorRT。TensorRT是一个用于高效推理的SDK&#xff0c;它能对TensorFlow、PyTorch等框架训…

go - 学习笔记 -2

go - 学习笔记 -2 类型转换运算符输入输出函数输入输出函数应用流程控制语句之分支语句流程控制语句之多分支语句星座案例分支语句嵌套循环语句循环语句和分支语句之间的嵌套for循环的作用域退出循环语句 类型转换 package mainimport ("fmt""reflect"&qu…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; &#x1f31e;详见如下专栏&#x1f31e; &…

Java毕业设计-基于springboot开发的漫画之家系统-毕业论文+PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的漫画之家系统-毕业论…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

Python Web开发记录 Day4:JavaScript

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 四、JavaScript1、JavaScript-基础①JavaScript…

postman访问k8s api

第一种方式&#xff1a; kubectl -n kubesphere-system get sa kubesphere -oyaml apiVersion: v1 kind: ServiceAccount metadata:annotations:meta.helm.sh/release-name: ks-coremeta.helm.sh/release-namespace: kubesphere-systemcreationTimestamp: "2023-07-24T07…