小谈设计模式(17)—状态模式
小谈设计模式(17)—状态模式
- 专栏介绍
- 专栏地址
- 专栏介绍
- 状态模式
- 关键角色
- 上下文(Context)
- 抽象状态(State)
- 具体状态(Concrete State)
- 核心思想
- Java程序实现
- 首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRequest():
- 然后,我们创建两个具体状态类 ConcreteStateA 和 ConcreteStateB,它们分别实现了抽象状态类 State:
- 接下来,我们创建一个上下文类 Context,其中包含一个指向当前状态的引用,并提供了一个方法 setState() 用于切换状态和一个方法 request() 用于处理请求:
- 最后,我们可以在客户端代码中使用上下文类来测试状态模式的效果:
- 输出结果
- 分析
- 优缺点分析
- 优点
- 1
- 2
- 3
- 缺点
- 1
- 2
- 总结
专栏介绍
专栏地址
link
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。

状态模式
状态模式是一种行为型设计模式,它允许一个对象在内部状态发生变化时改变其行为。状态模式将对象的行为封装在不同的状态类中,通过改变对象的状态来改变其行为。

关键角色
上下文(Context)
上下文是一个包含状态的对象,它定义了客户端与状态对象的交互接口。上下文中维护了一个指向当前状态的引用,并且在运行时可以切换到不同的状态。上下文将客户端请求委派给当前状态对象处理。
抽象状态(State)
抽象状态是一个接口或抽象类,它定义了状态对象的通用行为。具体状态类需要实现这个接口或继承这个抽象类,并且根据具体的状态来实现相应的行为。
具体状态(Concrete State)
具体状态是实现抽象状态的具体类。每个具体状态类都代表了上下文在特定状态下的行为。具体状态类负责处理上下文的请求,并在需要时切换到其他状态。

核心思想
将状态的判断和状态的行为分离,使得状态的变化不影响行为的变化。通过将状态的行为封装在具体状态类中,可以方便地添加新的状态或修改现有状态的行为,同时也避免了状态判断的复杂性。

Java程序实现
首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRequest():
public abstract class State {public abstract void handleRequest();
}
然后,我们创建两个具体状态类 ConcreteStateA 和 ConcreteStateB,它们分别实现了抽象状态类 State:
public class ConcreteStateA extends State {@Overridepublic void handleRequest() {System.out.println("处理请求,当前状态为A");}
}public class ConcreteStateB extends State {@Overridepublic void handleRequest() {System.out.println("处理请求,当前状态为B");}
}
接下来,我们创建一个上下文类 Context,其中包含一个指向当前状态的引用,并提供了一个方法 setState() 用于切换状态和一个方法 request() 用于处理请求:
public class Context {private State currentState;public Context() {// 初始化为初始状态currentState = new ConcreteStateA();}public void setState(State state) {currentState = state;}public void request() {currentState.handleRequest();}
}
最后,我们可以在客户端代码中使用上下文类来测试状态模式的效果:
public class Client {public static void main(String[] args) {Context context = new Context();// 处理请求,当前状态为Acontext.request();// 切换状态为Bcontext.setState(new ConcreteStateB());// 处理请求,当前状态为Bcontext.request();}
}
输出结果
处理请求,当前状态为A
处理请求,当前状态为B
分析
在上述示例中,我们通过状态模式实现了一个简单的上下文对象 Context,它可以根据不同的状态来处理请求。通过切换状态,上下文对象可以改变其行为。这样,我们可以方便地添加新的状态类或修改现有状态的行为,而不需要修改客户端代码。

优缺点分析
优点
1
通过将状态的行为封装在具体状态类中,可以使得状态的变化对客户端透明,客户端只需要与上下文进行交互,不需要关心具体的状态。
2
增加新的状态类相对容易,符合开闭原则,不需要修改现有的代码。
3
将状态的行为集中到具体状态类中,使得代码更加清晰,易于维护和扩展。
缺点
1
当状态的行为比较少或简单时,使用状态模式可能会导致类的数量增加,增加了代码的复杂性。
2
如果状态之间存在相互转换的复杂逻辑,可能需要引入其他模式来处理状态之间的转换。

总结
状态模式是一种通过将状态的行为封装在具体状态类中,使得状态的变化不影响行为的设计模式。它可以使代码更加清晰、易于维护和扩展,适用于状态变化较多且状态之间的行为差异较大的场景。
相关文章:
小谈设计模式(17)—状态模式
小谈设计模式(17)—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRe…...
Arm64体系架构-MPIDR_EL1寄存器
背景 在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的. 那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPID…...
MySQL支持哪些存储引擎
mysql支持九大存储引擎: 1)MYISAM存储引擎(优点:可被转换为压缩、只读表来节省空间。) 它管理的表具有以下特征: 使用三个文件表示每个表 格式文件-存储表结构的定义(mytable.frm) 数据文件-存…...
ElementUI结合Vue完成主页的CUD(增删改)表单验证
目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中,CU代表创建(Create)…...
Flutter开发笔记 —— 语音消息功能实现
前言 最近在开发一款即时通讯(IM)的聊天App,在实现语音消息功能模块后,写下该文章以做记录。 注:本文不提供相关图片资源以及IM聊天中具体实现代码,单论语音功能实现思路 需求分析 比起上来直接贴代码,我们先来逐步…...
冒泡排序和选择排序
目录 一、冒泡排序 1.冒泡排序的原理 2.实现冒泡排序 1.交换函数 2.单躺排序 3.冒泡排序实现 4.测试 5.升级冒泡排序 6.升级版代码 7.升级版测试 二、选择排序 1.选择排序的原理 2.实现选择排序 1.单躺排序 2.选择排序实现 3.测试 4.修改 5.测试 一、冒泡排序…...
【深度学习】UNIT-DDPM核心讲解
文章目录 大致介绍:扩散损失:转换损失:循环一致性损失:推理过程:优缺点: 参考文章: https://blog.csdn.net/ssshyeong/article/details/127210086 这篇文章对整个文章 UNIT-DDPM: UNpaired Imag…...
Java 线程的优先级
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...
金融数学方法:牛顿法
目录 1.牛顿法1.1 牛顿法介绍1.2 算法步骤 2. 具体算例3.总结 1.牛顿法 1.1 牛顿法介绍 牛顿法(Newton’s method),也被称为牛顿-拉夫森方法(Newton-Raphson method),是一种用于数值逼近根的迭代方法。它是…...
MongoTemplate | 多条件查询
MongoTemplate查询 Resource private MongoTemplate mongoTemplate;public <T> List<T> getDataList(String param1, Long param2, Class<T> clazz) {// 构建queryQuery query constructQuery(param1, param2);// 查询return mongoTemplate.find(query, cl…...
优秀程序员是怎么思考的?
首发日更公 Z 号:十二又十三 作为一名优秀的程序员,思考是我们工作中最重要的一部分。它不仅能够帮助我们解决问题,还能够提升我们的技术水平和职业发展。那么,优秀程序员是如何思考的呢?本文将为您介绍一个思考框架和…...
【juc】countdownlatch实现游戏进度
目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…...
Spring Webflux HttpHandler源码整理
HttpHandler的构造 自动启动配置类:HttpHandlerAutoConfigurationBean public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider) {HttpHandler httpHandler WebHttpHandlerBuilder.applicationContext(this.applicationContext).…...
Qt扩展-Advanced-Docking 简介及配置
Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能,这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…...
Decorator
Decorator 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合ÿ…...
分布式文件系统HDFS(林子雨慕课课程)
文章目录 3. 分布式文件系统HDFS3.1 分布式文件系统HDFS简介3.2 HDFS相关概念3.3 HDFS的体系结构3.4 HDFS的存储原理3.5 HDFS数据读写3.5.1 HDFS的读数据过程3.5.2 HDFS的写数据过程 3.6 HDFS编程实战 3. 分布式文件系统HDFS 3.1 分布式文件系统HDFS简介 HDFS就是解决海量数据…...
CSS中:root伪类的使用
在CSS中,:root是一个伪类选择器,它选择的是文档树的根元素。在HTML文档中,这个根元素通常是<html>。:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。 例如,你可以使用:root来定义一个全局的字体大小&a…...
VulnHub JANGOW
提示(主机ip分配问题) 因为直接在VulnHub上下载的盒子,在VMware上打开,默认是不分配主机的 所以我们可以在VirtualBox上打开 一、信息收集 发现开放了21和80端口,查看一下80端口 80端口: 检查页面后发现…...
OpenMesh 获取网格面片各个顶点
文章目录 一、简介二、实现代码三、实现效果一、简介 OpenMesh中有很多循环器,这里便是其中一种面顶点循环器,以此来获得面片的各个顶点。 二、实现代码 #define _USE_MATH_DEFINES #include <iostream> #include <unordered_map>...
【前端设计模式】之原型模式
原型模式特性 原型模式(Prototype Pattern)是一种创建型设计模式,它通过克隆现有对象来创建新对象,而不是通过实例化类。原型模式的主要特性包括: 原型对象:原型对象是一个已经存在的对象,它作…...
告别手动肝船!碧蓝航线自动化脚本Alas终极使用指南
告别手动肝船!碧蓝航线自动化脚本Alas终极使用指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为碧蓝航…...
智慧树自动刷课插件终极指南:5分钟快速上手,告别手动刷课烦恼
智慧树自动刷课插件终极指南:5分钟快速上手,告别手动刷课烦恼 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频操作而…...
【2026年华为暑期实习-非AI方向(通软嵌软测试算法数据科学)- 5月20日-第一题- 服务器处理计算任务】(题目+思路+JavaC++Python解析+在线测试)
题目内容 服务器集群中有 nnn 个待处理的计算任务,第 iii 个任务需要的总计算量为 tasks[i]tasks[i]...
别再怕触电了!拆解一个手机充电器,手把手教你搞懂隔离型反激电源(附原理图分析)
从废弃充电器到安全电源设计:隔离型反激电源的实战拆解指南 每次给手机充电时,那个不起眼的小方块里究竟藏着怎样的魔法?为什么我们触摸充电线不会触电?今天,我将带您亲手拆解一个废弃的5V/1A手机充电器,用…...
GGCNN实战指南:基于深度学习的实时机器人抓取生成网络深度解析
GGCNN实战指南:基于深度学习的实时机器人抓取生成网络深度解析 【免费下载链接】ggcnn Generative Grasping CNN from "Closing the Loop for Robotic Grasping: A Real-time, Generative Grasp Synthesis Approach" (RSS 2018) 项目地址: https://gitc…...
iPaaS厂商:五家主流集成平台的技术与市场观察
在数字化转型的深水区,企业级集成平台即服务(iPaaS)正在成为IT架构的“神经系统”。国内外众多厂商纷纷布局,形成了从全域智能集成到轻量SaaS连接的多极化格局。本文基于公开资料,对五家具有代表性的iPaaS厂商及其核心…...
嵌入式AI四大趋势:硬件定义模型、工具链平民化、多模态融合与系统级安全
1. 项目概述:嵌入式AI的十字路口与新机遇最近和几位在芯片原厂、终端设备公司做研发的朋友聊天,大家不约而同地都在讨论同一个话题:嵌入式AI的玩法,好像和几年前不太一样了。过去我们一提到“嵌入式AI”,脑子里蹦出来的…...
基于CMS8S6990评估板实现高精度电压电流测量:从血氧仪到通用测量工具的移植实践
1. 项目缘起与核心思路最近终于拿到了中微半导体(CMSemicon)正版的CMS8S6990血氧仪开发板。这块板子给我的第一印象就是“精致”,尺寸不大,但该有的接口和功能一应俱全,颇有点“麻雀虽小,五脏俱全”的味道。…...
如何为 OpenClaw 配置 Taotoken 以实现高效的 Agent 工作流
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何为 OpenClaw 配置 Taotoken 以实现高效的 Agent 工作流 基础教程类,面向使用 OpenClaw 框架构建 AI Agent 的开发者…...
用Logisim搞定计组课设:手把手教你搭建单周期MIPS CPU(附完整电路图)
从零构建单周期MIPS CPU:Logisim实战指南与避坑手册 当计算机组成原理的课程设计任务书发到手中时,许多同学面对"用Logisim实现MIPS CPU"的要求往往感到无从下手。本文将用工程师的视角,带你完整走通单周期CPU的设计全流程…...
