23种设计模式之状态模式
目录
- 1. 简介
- 2. 代码
- 2.1 State (定义抽象状态接口)
- 2.2 StartState (实现具体状态类)
- 2.3 EndState (实现具体状态类)
- 2.4 Context (定义上下文类)
- 2.5 Test (测试类)
- 2.6 运行结果
- 3. 使用场景
- 4. 优缺点
- 5. 总结
1. 简介
状态模式(State Pattern) 是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。这种模式通过将对象的状态和行为解耦,使得状态的变化不会直接影响对象的行为,从而提高了代码的可读性和可维护性。
状态模式主要由三个角色组成:
- 上下文(Context) :上下文类负责维护当前状态对象的引用,并提供对外接口,让客户端可以通过上下文与不同的状态对象进行交互。上下文类通常包含业务逻辑,这些逻辑会根据当前状态的不同而变化。
- 抽象状态(State) :抽象状态类定义了所有具体状态类共有的方法。这个类可以是一个接口或抽象类,用于声明状态更新的操作方法有哪些,具体实现由子类完成。
- 具体状态(Concrete State) :具体状态类继承抽象状态类,并实现具体状态下的行为逻辑。每个具体状态类对应一种状态的具体实现,处理与上下文相关的行为和状态转换。
2. 代码
2.1 State (定义抽象状态接口)
public interface State {public void doAction(Context context);
}
2.2 StartState (实现具体状态类)
public class StartState implements State{@Overridepublic void doAction(Context context){System.out.println("Player is in start state");context.setState(this);}public String toString(){return "Start State...";}
}
2.3 EndState (实现具体状态类)
public class EndState implements State{@Overridepublic void doAction(Context context){System.out.println("Player is in End State");context.setState(this);}public String toString(){return "End State...";}
}
2.4 Context (定义上下文类)
public class Context {private State state;public Context() {state = null;}public void setState(State state) {this.state = state;}public State getState() {return state;}
}
2.5 Test (测试类)
public class Test {public static void main(String[] args) {Context context = new Context();State state = new StartState();state.doAction(context);System.out.println(context.getState().toString());state = new EndState();state.doAction(context);System.out.println(context.getState().toString());}
}
2.6 运行结果
Player is in start state
Start State...
Player is in End State
End State...
3. 使用场景
几种场景:
对象的行为依赖于其状态:当一个对象的行为随着其内部状态的变化而变化时,可以使用状态模式。例如,在电子商务系统中,订单可能经历多种状态(如创建、支付、发货、完成和取消),每个状态下可以执行的操作不同,状态模式可以很好地管理这种状态的变化。
代码中包含大量的条件语句:当代码中包含大量的条件语句,并且这些条件语句表示对象的不同状态时,可以使用状态模式。状态模式可以将不同状态的处理分离出来,使得代码更加清晰。
对象的状态转换规则复杂:当对象的状态转换规则非常复杂时,可以使用状态模式。状态模式可以将状态转换规则封装在状态类中,使得状态转换更加灵活、可扩展。
需要增加新的状态:当需要增加新的状态时,可以使用状态模式。通过增加新的状态类,可以很容易地扩展状态模式。
对象具有多种状态且状态之间存在转换关系:当对象的行为随着其内部状态的变化而变化,并且这些状态之间存在复杂的转换逻辑时,状态模式非常有用。例如,在游戏编程中,可以根据游戏的不同阶段(如游戏开始、进行中、结束)来改变游戏逻辑。
并发编程中的线程状态管理:在并发编程中,可以根据线程的不同状态(如运行、等待、阻塞)来改变线程的行为。
图形用户界面(GUI)事件处理:在GUI开发中,可以根据用户界面的不同状态(如加载、成功、错误)来改变界面的行为。
银行系统中的账号状态管理:在银行系统中,可以根据账户的不同状态(如正常、冻结、注销)来管理账户的行为。
酒店系统中的房间状态管理:在酒店系统中,可以根据房间的不同状态(如已预订、已入住、空闲)来管理房间的使用情况。
TCP/IP网络连接中的状态管理:在TCP/IP网络连接中,可以根据连接的不同状态(如已建立、聆听、关闭)来处理不同的网络请求。
状态模式是一种非常实用的设计模式,它通过将对象的状态转换封装在状态类中,使得对象的状态转换更加灵活、可扩展,降低了对象的复杂度,提高了代码的可读性和可维护性。
4. 优缺点
优点:
- 结构清晰:状态模式将与特定状态相关的行为局部化到一个状态类中,使得代码结构更加清晰,易于理解和维护。
- 减少条件语句:通过使用状态模式,可以避免在代码中出现大量的条件判断语句(如switch-case或if-else),从而提高代码的可读性和简洁性。
- 符合开闭原则:状态模式允许在不修改现有代码的情况下添加新的状态,符合开闭原则,即对扩展开放,对修改关闭。
- 封装性好:状态的切换和行为变化被封装在类的内部实现,外部调用无需了解类内部如何实现状态和行为的变换。
- 易于扩展:增加新的状态只需增加新的状态类,而不需要修改现有代码,这使得系统具有良好的可维护性和可扩展性。
- 提高灵活性:状态模式支持动态地添加新的状态,无需修改现有代码,增强了系统的灵活性和可扩展性。
缺点:
- 类数量增加:每增加一种状态都需要创建一个新的状态类,这可能导致系统中类的数量显著增加,增加了系统的复杂性和管理难度。
- 复杂性增加:在一些简单的应用场景下,使用状态模式可能会引入不必要的复杂性,导致系统设计和代码维护的难度增加。
- 耦合性强:虽然状态模式将状态之间的行为分离,但状态之间的切换仍然存在一定的耦合关系,需要通过上下文类来进行状态的切换,可能会影响系统的灵活性。
- 过度设计:如果状态数量较少或状态转换逻辑简单,则使用状态模式可能会被认为是过度设计,反而降低代码的可读性。
5. 总结
无
相关文章:
23种设计模式之状态模式
目录 1. 简介2. 代码2.1 State (定义抽象状态接口)2.2 StartState (实现具体状态类)2.3 EndState (实现具体状态类)2.4 Context (定义上下文类)2.5 Test (测试类…...
Elasticsearch Serverless 中的数据流自动分片
作者:来自 Elastic Andrei Dan 在 Elastic Cloud Serverless 中,我们根据索引负载自动为数据流配置最佳分片数量,从而使用户无需摆弄分片。 传统上,用户会更改数据流的分片配置,以处理各种工作负载并充分利用可用资源。…...
YOLOv10改进,YOLOv10添加U-Netv2分割网络中SDI信息融合模块+GSConv卷积,助力小目标
理论介绍 完成本篇需要参考以下两篇文章,并已添加到YOLOv10代码中 YOLOv10改进,YOLOv10添加U-Netv2分割网络中SDI信息融合模块,助力小目标检测YOLOv10改进,YOLOv10添加GSConv卷积+Slim-neck,助力小目标检测,二次创新C2f结构下文都是手把手教程,跟着操作即可添加成功 目…...
xshell连接虚拟机,更换网络模式:NAT->桥接模式
NAT模式:虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码,只要宿主机能够访问网络,虚拟机也能够访问。对外部网络而言,它看到的是宿主机的IP地址,而不是虚拟机的IP。但是,宿主机可…...
sql的where条件中使用case when
场景: 1、使用oracle数据库,数据类型为number,需要正无穷值。 2、数据表中有两个金额值,最大值和最小值, 如10~20, 30 ~40,40以上,数据库中这样设计 id name min max 1 j 10 20 2 …...
MacOS 上以源码形式安装 MySQL 5.7
以下是在 macOS 上从源码安装 MySQL 5.7 的步骤: 前置条件 安装 Homebrew:如果你还没有安装 Homebrew,可以在终端中运行以下命令进行安装: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install…...
MySQL 事务隔离级别详解
一、事务的基本概念 (一)什么是事务 事务是一个逻辑工作单元,由一组数据库操作组成。这些操作要么全部成功执行,要么全部回滚,以确保数据库的一致性。事务具有以下四个特性,通常被称为 ACID 特性ÿ…...
C语言——高精度问题
1、高精度计算的本质:竖式计算; 2、适用解决超出long long int 范围的大整数计算 #include<stdio.h> #include<string.h> #define N 100 char str1[N4]{0},str2[N4]{0}; int arr1[N4]{0},arr2[N4]{0}; int ans[N5]{0};//将字符串转化成整型…...
aippt:AI 智能生成 PPT 的开源项目
aippt:AI 智能生成 PPT 的开源项目 在现代办公和学习中,PPT(PowerPoint Presentation)是一种非常重要的展示工具。然而,制作一份高质量的PPT往往需要花费大量的时间和精力。为了解决这一问题,aippt项目应运…...
【Qt之·类QSettings·参数保存】
系列文章目录 文章目录 前言一、概述1.1 QSetting是什么1.2 为什么学习QSetting是重要的 二、不同存储位置的优缺点三、 QSetting的高级用法四、实例演示总结 前言 在当今的应用程序开发中,设置管理是一个至关重要的方面。应用程序的设置包括用户偏好、配置选项和其…...
location重定向和nginx代理
文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…...
iptables详解
华子目录 什么是防火墙分类netfilter(数据包过滤)定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...
Edge SCDN深度解析,边缘安全加速的创新实践
边缘安全加速(Edge Secure Content Delivery Network,SCDN)是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术,智能调度使用户就近获取所需内容,为…...
solidworks常见问题已解决
solidworks常见问题已解决 问题1:step总是提示默认模板无效。问题2:异型孔向导”时出现了“找不到标准数据库。问题3:找不到CalloutForm.txt文件,标注将由几何体定义。问题5:工程图显示文件损坏不能保存。问题6&#x…...
vCenter开启HA报错
昨天给客户开启vCenter开启HA功能报错,报错的内容比较多 博通官方给出解决办法 https://knowledge.broadcom.com/external/article/318929/error-vsphere-ha-agent-cannot-be-correct.html 常规的解决办法 1.关闭集群HA,再次开启HA 2.主机进入维护模式,再次加入…...
在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?
make 命令 并不是所有 Ubuntu 系统都默认安装的,但它通常是开发工具链的一部分,许多开发者会在安装系统后配置它。make 是一个非常重要的构建工具,用于自动化编译和构建过程,特别是在编译软件或内核时。 make 的来源 make 是一个…...
js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写
问: 我按在要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写? 回答: 问: <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…...
前端使用 Cursor 的最佳助手 - PromptCoder
前端使用 Cursor 的最佳助手 - PromptCoder 你是否正在使用 Cursor 进行前端开发,却苦于繁琐的代码生成和原型图的还原?你是否渴望一个更高效、更智能的工具来提升你的开发效率?那么,你一定不能错过 PromptCoder! Pr…...
深入了解 Spring IOC,AOP 两大核心思想
文章目录 一、Spring 基础 - 控制反转(IOC)1.1. 引入1.2. 如何理解 IOCSpring Bean 是什么?IoC 是什么?IoC 能做什么?IoC 和 DI 是什么关系? 1.3. IoC 配置的三种方式xml 配置Java 配置注解配置 1.4. 依赖注…...
QT从入门到精通——Qlabel介绍与使用
1. QT介绍——代码测试 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)应用程序,也支持非图形应用程序的开发。Qt 提供了一套工具和库,使得开发者能够高效地构建高性能、可移植的应用程序。以下是…...
华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!
文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器(父子单向通信)1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器(父子双向通信)1. Link装饰器的特点3. Link使用示例 四…...
node.js 环境配置
node_global下创建node_modules 系统变量 新建NODE_Path -> node_modules的路径 用户变量 编辑Path 编辑…\npm为 node_modules的路径 系统变量 Path 新建 %NODE_PATH% CMD测试 npm install express -g 报错 npm error code ETIMEDOUT源的连接超时,没用了要换源 …...
高并发数据采集场景下Nginx代理Netty服务的优化配置
高并发数据采集场景下,要优化Nginx反向代理来支持多个Netty数采服务并保证稳定的性能,可以从以下几个方面对Nginx进行优化配置。 直连模式(直接通过 Nginx 处理与后端 Netty 服务的连接,而不作为反向代理),…...
【C++算法】40.模拟_N 字形变换
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 6. N 字形变换 题目描述: 解法 解法一:模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去,最后从左往右读取。 解法二:模拟优化-…...
【云计算】虚拟化技术
目录 1. 虚拟化技术在云计算中的那些地方发挥了关键作用? 2. 比较VMare,Xen等虚拟化产品的关键技术,以及对云计算技术提供的支持? 3. 服务器虚拟化,存储虚拟化和网络虚拟化都有哪些实现方式? 4. 讨论桌面…...
手机租赁系统开发指南一站式服务流程解析
内容概要 手机租赁系统的开发是一个复杂但有趣的过程,像搭建乐高一样,只要找到合适的模块,就能打造出一个宾至如归的租赁平台。在这部分,我们将对开发流程的整体结构进行简要概述,并指出每个环节的重要性。 首先&…...
【机器学习】—时序数据分析:机器学习与深度学习在预测、金融、气象等领域的应用
云边有个稻草人-CSDN博客 目录 引言 1. 时序数据分析基础 1.1 时序数据的特点 1.2 时序数据分析的常见方法 2. 深度学习与时序数据分析 2.1 深度学习在时序数据分析中的应用 2.1.1 LSTM(长短期记忆网络) 2.2 深度学习在金融市场预测中的应用 2…...
OBS + SRS:打造专业级直播环境的入门指南
OBS SRS:打造专业级直播环境的入门指南 1. OBS简介2. OBS核心功能详解2.1 场景(Scenes)管理2.2 源(Sources)控制2.3 混音器功能2.4 滤镜与特效2.5 直播控制面板 3. OBS推流到SRS服务器配置指南3.1 环境准备3.2 OBS推流…...
收银系统源码-会员管理
会员制早已成为门店经营首选的营销工具,尤其是针对连锁多门店会员管理尤为重要。 必然要求门店的收银系统需要支持会员管理,能提供多种会员权益; 1.会员类型 收银系统支持常规会员、plus付费会员、可绑定实体卡; plus会员&…...
MongoDB深化与微软的合作,新增人工智能和数据分析集成和微软 Azure Arc支持
日前,在微软Ignite技术大会上,MongoDB公司宣布面向MongoDB与微软共同客户推出三项新功能,双方协作更进一步。首先,需要构建由检索增强生成 (RAG) 技术驱动的应用程序的客户,现在可以选择MongoDB Atlas作为微软Azure AI…...
商城做网站哪家好/词语搜索排行
主要内容: 1. 函数名的使用以及第⼀类对象2. 闭包3. 迭代器1. 函数名的使用以及第⼀类对象 函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量。 (1) 函数名的内存地址 def func():print("呵呵") print(func) #<function func at…...
网站建设应该注意哪些原则/短视频矩阵seo系统源码
第一步启用Ad Hoc Distributed Queries 在SQLserver执行以下的语句: exec sp_configure show advanced options,1 reconfigure exec sp_configure Ad Hoc Distributed Queries,1 reconfigure ----允许在进程中使用ACE.OLEDB.12 在安装了 ACE2010的驱动才可以执行…...
网址大全hao123/seo策略什么意思
coursera上的公开课《https://www.coursera.org/course/textanalytics》系列,讲的非常不错哦。 最后讲了文本分类,和plsa的几种变形,包括: opinion mining和sentiment analysis:Ordinal Logistic Regression opinion…...
建设摩托车官网中国官网报价大全/太原seo关键词优化
<meta http-equiv"X-UA-Compatible" content"IEEmulateIE7"/>转载于:https://www.cnblogs.com/xjt360/p/3604410.html...
徐州做网站管理的公司/广告联盟app下载
# yum install gconf-editor打开gconf-editor找到/apps/panel/clock/prefs/(这是默认位置)修改custom_format的值为%Y-%m-%d %H:%M,也可自己定制其他修改format的值为custom转载于:https://www.cnblogs.com/dule/archive/2013/03/25/2981115.html...
毕业设计做的网站抄袭/谷歌浏览器官网
文章目录简介使用相机前的准备工作在flutter中使用camera总结简介 在app中使用相机肯定是再平常不过的一项事情了,相机肯定涉及到了底层原生代码的调用,那么在flutter中如何快速简单的使用上相机的功能呢? 一起来看看吧。 使用相机前的准备…...