探索Java设计模式:状态模式

深入理解与实践Java设计模式之状态模式

一、简要介绍

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。状态模式通过引入状态类来封装与状态相关的行为,并使上下文对象(即拥有状态的对象)与这些状态对象之间进行交互,从而将复杂的“条件判断”代码转化为对象之间的简单方法调用。这样做的好处在于,当需要增加新状态或修改状态相关行为时,只需增加或修改状态类,而无需改动上下文对象的代码,增强了系统的可扩展性和可维护性。

二、实现示例

下面以ATM自动取款机为例,展示状态模式的实现:

// 定义状态接口
interface ATMState {void insertCard();void ejectCard();void enterPin(int pin);void requestCash(int amount);void dispenseCash();void deductBalance();
}// 定义具体状态类
class NoCardState implements ATMState {// 实现相应状态下的行为
}class HasCardState implements ATMState {// 实现相应状态下的行为
}class PinEnteredState implements ATMState {// 实现相应状态下的行为
}class CashDispensedState implements ATMState {// 实现相应状态下的行为
}// 定义上下文对象:ATM机
class ATM {private ATMState currentState;public void setState(ATMState state) {this.currentState = state;}// 其他ATM机功能方法,如取款、查询余额等,通过调用currentState对应的方法实现
}// 客户端代码
public class Client {public static void main(String[] args) {ATM atm = new ATM();atm.setState(new NoCardState());// ... 使用ATM进行操作,状态会随操作发生变化}
}

在这个例子中,ATMState接口定义了ATM机在不同状态下可能的行为,如插卡、拔卡、输入密码、请求取款等。具体的NoCardStateHasCardStatePinEnteredStateCashDispensedState类实现了这些行为。ATM类作为上下文对象,持有一个ATMState类型的成员变量currentState,并提供了设置当前状态的方法。当ATM机进行操作时,实际上是调用currentState对应的方法。这样,当ATM机的状态发生改变时,只需更改currentState引用的对象,即可实现行为的变化。

三、实际运用

状态模式在实际开发中有广泛的应用,以下是一些典型场景:

  1. 业务流程管理:在涉及复杂业务流程的应用中,如订单处理、项目审批等,状态模式可以清晰地表示流程中的各种状态以及状态之间的转移规则,使得流程控制更为直观且易于扩展。

  2. 用户身份认证:在用户登录系统中,用户状态可能包括未登录、已登录、登录超时、账户锁定等。状态模式可以很好地封装这些状态及其相关行为,如登录、登出、刷新登录状态等。

  3. 网络连接状态:在网络通信应用中,如即时通讯软件、在线游戏等,连接状态可能包括断开连接、正在连接、已连接、连接中断等。状态模式可以帮助管理这些状态以及触发相应的行为,如重连、发送心跳包、更新用户在线状态等。

  4. 设备控制:在工业自动化、智能家居等领域,设备可能有多种工作模式或状态,如待机、运行、故障、维护等。状态模式能够很好地组织这些状态及其关联的操作,如切换模式、启动设备、报警处理等。

总结来说,状态模式通过将状态与行为解耦,使得状态变化带来的行为改变更加清晰、灵活且易于管理。在设计中,当发现对象的行为依赖于其内在状态,并且这些状态可能会随时间变化时,应考虑使用状态模式。这有助于减少条件判断的复杂性,提高代码的可读性和可维护性,同时使得状态相关行为的扩展和修改变得更为简单。

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

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

相关文章

华为校招机试 - 扑克牌消除(20240417)

题目描述 从一副扑克牌中随机抽取 n 张牌组成一个序列,规定连续 3 张相同牌号的卡牌可以消除,剩余卡牌按照当前顺序重新合并成新的序列后继续消除,重复以上步骤直到无法消除,最后请输出结束后剩余的卡牌序列。 注:存在连续 4 张相同牌号的情况,消除后剩余一张。 输入描…

数据结构-KMP算法

KMP算法 简单的模式匹配算法 定义:子串的定位操作通常称为串的模式匹配,他求的是子串在主串中的位置过程 逐个字符比较 从主串指针 i 对应的字符和模式串指针 j 对应的字符开始,依次比较它们是否相等。若相等,则同时移动 i 和 j 向右一位,继续…

C语言本身不难,难得是应用场景很多

你学了C语言多半是要做项目的,这个过程中C语言是远远不够的,你把这部分难度加到C语言上,自然就难了在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区…

【python】如何通过python来发送短信

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

MySQL-多表设计

黑马程序员JavaWeb开发教程 文章目录 一、一对多(多对一)二、一对一三、多对多 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联&#xf…

【日志】CSDN-AI助手升级日志

CSDN-AI助手升级日志 2023/04/05上线 支持点赞、收藏回访 关注回访(对方至少有一条博客的记录) 评论回访 私信检测到群发消息自动三连 OR 通过私信指令三连触发 bug优化 优化检测模式,防止出现多触发情况 为了防止操作额度不够&#xff0c…

虚拟局域网PPTP配置与验证

虚拟局域网PPTP配置与验证 前言PPTP服务侧安装配置REF 前言 虚拟专用网(Virtual Private Network,VPN)是一种通过公共网络建立安全的连接的技术。它能够在不同的地理位置之间建立私密的通信通道,实现远程访问网络资源的安全性和隐…

2024.4.21周报

目录 摘要 Abstract 文献阅读:Next Item Recommendation with Self-Attentive Metric Learning 问题及方法 论文贡献 方法论 序列感知的推荐系统 神经注意模型 模型:ATTREC 序列推荐 基于Self-Attention的用户短期兴趣建模 用户长期兴趣建模…

JSS作业

JSS作业&#xff1a; 1: <script>var cnt parseInt(window.prompt("请输入打印的行数&#xff1a;"));for (var i 1; i < cnt; i){for (var j 1; j < i; j){document.write("*")}document.write("<br>")} </script>…

量化交易:多因子选股结合布林带择时

哈喽,大家好,我是木头左! 多因子选股策略是一种基于多个财务指标来筛选股票的方法。这种策略认为,通过综合考虑多个因素,可以更全面地评估一家公司的价值和盈利潜力。 感兴趣的朋友,可以在下方公号内回复:001,即可获取源码,共同交流! 策略的基本原理 在本策略中,我…

区块链 | OpenSea:Toward Achieving Anonymous NFT Trading 一文的改进方案

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading &#x1f951;吐槽&#xff1a; 这论文怎么老有描述不清、前后不一致的地方&#x1f607; 正文 在本节中&#xff0c;我们将具体展示我们方案的构建。我们将基于一个示例来描述我们方案的工作流程&…

【MongoDB】数据的自动过期,TTL索引

文章目录 1. 前言2.概念与使用2.1.使用方式2.2.数组中包含日期字段2.3.设置具体的过期时间点2.4.额外的过滤条件 3.总结 1. 前言 在近期的工作中&#xff0c;使用了MongoDB来保存了一些日志数据&#xff0c;但是这些日志数据具有一定的时效性&#xff0c;也就是按照业务的需要…

mac可以玩steam吗 mac安装steam教程 苹果电脑能打steam游戏吗 苹果电脑怎么安装windows 苹果mac电脑配置AI功能的M4芯片

众所周知&#xff0c;Steam作为一个热门的游戏平台&#xff0c;深受国内外玩家的喜爱&#xff0c;平台中包含了无数的游戏&#xff0c;在作战时玩家们能够与朋友们互动聊天&#xff0c;还能匹配好友组队&#xff0c;同时还能增进与同伴的默契度。 但是最近有玩家们提问说&#…

MySQL数据库中备份和查询

总所周知我们用到的数据有可能丢失&#xff0c;那么我们就可以通过备份把数据找回&#xff0c;如何操作&#xff1a;请先看下面讲解 备份&#xff1a; 导出&#xff1a; 先对数据库进行备份&#xff0c;然后提取备份文件中的SQL语句 这就是我们导出数据&#xff0c;导出了就有…

关于conda占C盘内存的问题

文章目录 前言一、C盘中.conda文件中的envs二、C盘中.conda文件中的pkgs 前言 最近发现C盘空间越来越少&#xff0c;于是就去清理了一下conda在C盘的存储&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;足足十几G&#xff01;于是去网上搜索了相关的包能不能删除&a…

.Net4.0 Web.config 配置实践

目录 关于 Web.config 运行环境 配置实践 请求验证模式兼容旧版本 上传文件限制 Request.Path危险值配置 全站应用UTF-8编码 设置日期格式 每个会话的限制并发请求数 正常运行指定扩展名的文件 Json字符串超出最大长度限制 控件早期版本的呈现方式 C# 操作 Web.co…

电梯节能的推广意义

之前关于电梯能量回馈设备&#xff0c;小伍已经做了很多介绍&#xff0c;那么小伙伴们&#xff0c;他的推广意义你真的了解了么&#xff1f; 第一&#xff1a;节电降耗&#xff0c;电梯在运行过程中会产生大量的惯性能量&#xff0c;这些能量如果不被利用就会浪费。能量回馈技术…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

UDP文件传输工具之UDP怎么限流

UDP&#xff08;用户数据报协议&#xff09;以其低延迟和高速度的特点&#xff0c;在实时应用和大数据传输中扮演着重要角色。然而&#xff0c;UDP作为一种无连接的协议&#xff0c;并不保证数据包的顺序、完整性或可靠性。 因此&#xff0c;企业在寻求一种方式&#xff0c;有…

尝试给笔记本超频

超频&#xff08;英语&#xff1a;overclocking&#xff09;是把一个电子配件的时脉速度提升至高于厂方所定的速度运作&#xff0c;从而提升性能的方法&#xff0c;但此举有可能导致该配件稳定性以及配件寿命下降。 笔记本配置为&#xff1a; 处理器 AMD Ryzen 7 7730U wit…