状态模式(State Pattern)

news/2025/3/14 18:08:57/

定义

状态模式(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.ppmy.cn/news/1365060.html

相关文章

猫头虎分享已解决Bug || Error: Minified React error #130

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【数据库】mybatis使用总结

文章目录 1. 批量插入、检索<foreach>2. <if> 判断等于情况3. 模糊查询(pgsql为例)4. 分页5. <resultMap > 中collection 和association 1. 批量插入、检索<foreach> <insert id"insertSystemService" >insert into SYSTEMINFO_SER…

ruoyi框架学习

RBAC模型 数据字典 拦截器 token没有&#xff0c;submit&#xff0c;request.js中&#xff0c;前端前置拦截器&#xff0c;响应拦截器 后台 注解

nginx概述

文章目录 nginx特点安装操作使用systemctl管理的操作使用源码包安装的操作 nginx源码 nginx特点 反向代理 反向代理服务器需要能处理大量并发连接。Nginx就可以&#xff0c;所以Nginx适合做反向代理服务器 负载均衡动静分离 Nginx实例处理大并发&#xff0c;时候做作为静态服务…

[C++]C++实现本地TCP通讯的示例代码

这篇文章主要为大家详细介绍了C如何利用TCP技术,实现本地ROS1和ROS2的通讯,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下 概要服务端代码 头文件源代码客户端代码 概要 利用TCP技术&#xff0c;实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include &…

golang的反射探索

1、golang中反射常用的场景 1》类型检查—通用类包或者函数的时候&#xff0c;在运行时可以动态的获取任意对象的类型信息 2》动态调用方法—运行时动态的选择使用哪个方法 3》结构体标签处理—结构体字段一般是通过tag来注解。运行时可以通过反射读取tag。常用于解析配置文件&…

project.config.json 文件内容错误] project.config.json: libVersion 字段需为 string, string

家人们&#xff0c;遇到了一个新的报错 于是从网上找了各种方法&#xff0c;有说把开发者工具关闭重启的&#xff0c;有说开发者工具下载重新下载的&#xff0c;有说开发者工具路径安装得在C盘的&#xff0c;均没有效果 解决方法&#xff1a; 1、运行项目&#xff0c;在开发者…

OSX逆向分析基础

文章目录 前言OSX基础工具方法动态调试附录参考链接 前言 如果你想真正成为软件高手&#xff0c;就得了解底层运作机制。逆向&#xff0c;不会让你成为扎克伯格或张一鸣&#xff0c;但或许能让你成为安全专家。 OSX基础 Mac OS X下二进制可执行文件的动态链接库是dylib文件。…