JAVA: 状态模式(State Pattern)的技术指南

news2025/1/5 0:31:03

1、简述

状态模式是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的行为抽取到独立的状态类中,使得增加新状态变得简单,且不影响其他状态。

设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git

本文将详细介绍状态模式的概念、结构、优缺点,以及实际应用案例。

在这里插入图片描述


2、什么是状态模式?

状态模式通过将对象的行为与其内部状态解耦,来实现行为的动态切换。它通过引入一系列状态类,每个类封装一种状态下的行为。

典型应用场景包括:

  • 文件下载状态管理(开始、暂停、完成)。
  • 游戏角色状态(攻击、移动、防御)。
  • 工作流管理(审批状态)。

状态模式包含以下角色:

  • 上下文(Context):维护状态实例,定义客户端与状态的交互接口。
  • 状态(State):定义状态的公共接口。
  • 具体状态(ConcreteState):实现特定状态下的行为。

类图:

Context <--> State <--> ConcreteState

3、实际案例

假设我们需要管理订单的状态,包括:待支付已支付已完成

// 状态接口
public interface OrderState {
   
    void handleOrder();
}

// 具体状态类
public class PendingState implements OrderState {
   
    @Override
    public void handleOrder() {
   
        System.out.println("订单状态:待支付。请完成支付!");
    }
}

public class PaidState implements OrderState {
   
    @Override
    public void handleOrder() {
   
        System.out.println("订单状态:已支付。订单处理中。");
    }
}

public class CompletedState implements

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

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

相关文章

小程序基础 —— 02 微信小程序账号注册

微信小程序账号注册 小程序开发与网页开发不一样&#xff0c;在开始微信小程序开发之前&#xff0c;需要访问微信公众平台&#xff0c;注册一个微信小程序账号。 有了小程序的账号以后&#xff0c;才可以开发和管理小程序&#xff0c;后续需要通过该账号进行开发信息的设置、…

安卓入门十一 常用网络协议四

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09; MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下&#xff0c;实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式&#xff1a;MQTT 使用发布/订…

在 Swift 中使用 SQL 组合人员和地址数据

文章目录 摘要描述问题描述示例输入与输出 Swift 代码解决方案代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在本篇文章中&#xff0c;我们将讨论如何结合两个表——Person 和 Address&#xff0c;以便生成包含每个人的姓名和地址信息的结果表。如果某人的地址信息不…

AAL省电效果对比

AAL省电的原理主要是‌通过根据显示内容来降低背光&#xff0c;然后通过调节gamma来补偿显示亮度&#xff0c;从而达到省电的效果‌。具体来说&#xff0c;gamma值越高&#xff0c;灰度越低&#xff0c;图像越暗。因此&#xff0c;颜色越暗的图片越省电&#xff0c;这也是为什么…

ArcGIS中怎么进行水文分析?(思路介绍)

最近有人咨询&#xff0c;ArcGIS中怎么进行水文分析&#xff0c;大致的说一下河网提取的思路哈 解决思路&#xff1a;dem填洼→计算水流方向→计算水流累积矩阵→形成河网 dem填洼 计算水流方向 计算水流累积矩阵 用栅格计算器&#xff0c;设阈值&#xff08;自己多次尝试&…

Debian-linux运维-ssh配置(兼容Jenkins插件的ssh连接公钥类型)

系统版本&#xff1a;Debian 12.5、11.1 1 生成密钥对 可以用云服务商控制台生成的密钥对&#xff0c;也可以自己在客户端或者服务器上生成&#xff0c; 已经有密钥对就可以跳过这步 用户默认密钥文件路径为 ~/.ssh/id_rsa&#xff0c;可以在交互中指定路径&#xff0c;也可…

ZZNUOJ 1798:大小写判断(C/C++/Java)

题目描述 给定一个英文字母判断这个字母是大写还是小写。 输入 输入只包含一个英文字母c。 输出 如果c是大写字母,输出“upper”,否则输出“lower”。 样例输入 x 样例输出 lower 来源 蓝桥杯算法训练 常见的ASCII值 ASCII表中可以记下部分特殊的值(十进制)(字母从A到Z&am…

Wonder Dynamics技术浅析(二):人体姿态估计

Wonder Dynamics 的人体姿态估计模块旨在从图像或视频中检测并定位人体关键点&#xff08;如关节、肢体等&#xff09;&#xff0c;为后续的动作捕捉、虚拟角色动画等应用提供基础数据。 一、人体姿态估计概述 人体姿态估计是指从图像或视频中检测并定位人体关键点的位置&…

前端压缩字体包方法,8MB可压缩至900K!

1、先安装压缩工具 npm install font-spider -g2、新建个文件夹&#xff0c;把要压缩的字体放进去&#xff0c;然后新建一个html&#xff0c;如下图 目前没有经过压缩的字体包是接近8MB 新建的html内容如下&#xff0c;直接复制即可 解释&#xff1a; 1、在样式中定义要压缩…

mysql的索引类型和索引方法

前言 在 MySQL 中&#xff0c;索引类型和索引方法是两个不同的概念。索引类型决定了可以存储的数据种类以及索引的功能特性&#xff0c;而索引方法则定义了索引数据的组织方式和查找机制。在 MySQL 中&#xff0c;索引&#xff08;Index&#xff09;是用于加快数据检索速度的数…

七种改进爬山算法的方法

一、爬山算法 爬山算法(Hill Climbing Algorithm)是一种启发式的基于局部最优解的搜索算法,用于在给定的搜索空间中寻找全局最优解或足够好的解。它属于局部搜索算法,通常用于解决优化问题,包括连续和离散问题。 爬山算法模拟了爬山的过程,从某个随机起始点开始,不断向更…

推荐5款局域网IP扫描工具,支持电脑+Android!

在日常网络管理中&#xff0c;快速扫描局域网中的设备和IP地址是一项基本但非常重要的任务。无论是排查网络问题还是进行设备管理&#xff0c;一款好用的 IP 扫描工具都能让你事半功倍。 如何选择适合自己需求的局域网 IP 扫描工具&#xff1f;有哪些功能强大又易于上手的工具…

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人&#xff0c;所幸终会天亮。明天就是新的开始&#xff0c;我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen&#xff0c;这是一个 Rust 库和 CLI…

03-栈和队列

目录 3.1栈和队列的定义和特点 3.2栈的表示和操作的实现 顺序栈的表示和实现 Ⅰ.顺序栈的初始化 Ⅱ.顺序栈的入栈 Ⅲ.顺序栈的出栈 链栈的表示和实现 Ⅰ.链栈的初始化 Ⅱ.链栈的入栈 Ⅲ.链栈的出栈 Ⅳ.取栈顶元素 Ⅴ.判断链栈是否为空 3.3栈与递归 3.4队列的表示和操…

Vue 3.0 中 template 多个根元素警告问题

在 Vue 2.0 中&#xff0c;template 只允许存在一个根元素&#xff0c;但是这种情况在 Vue 3.0 里发生了一些变化。 在 Vue 3.0 中开始支持 template 存在多个根元素了。但是因为 VSCode 中的一些插件没有及时更新&#xff0c;所以当你在 template 中写入多个根元素时&#xf…

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…

人工智能与传统编程的主要区别是什么?

传统编程&#xff1a;开发者预先编写软件行为规则&#xff0c;代码基于程序员定义逻辑处理输入并产生确定输出&#xff0c;具有确定性、手动编写规则和结构化逻辑特点&#xff0c;如垃圾邮件分类程序基于预设关键词等规则。AI 编程&#xff1a;从数据中学习而非手动编写规则&am…

电脑tkbrep.dll缺失怎么修复?

电脑运行时常见问题解析&#xff1a;tkbrep.dll缺失的修复策略与系统维护建议 在软件开发和电脑使用的日常中&#xff0c;我们时常会遇到各种系统报错和文件缺失的问题&#xff0c;其中tkbrep.dll的缺失便是一个较为常见的例子。作为软件开发从业者&#xff0c;我深知这些问题…

Nacos源码之服务注册

1. 准备工作 ​ 我们在使用Nacos作为SpringCloud中的注册中心组件时&#xff0c;最常用到的是它的三个功能&#xff1a;服务注册、服务发现和配置中心。 ​ 现在我们单机启动多个user-client&#xff0c;当我们成功运行UserClientApplication后可以在IDEA的service一栏中找到…

2025和数集团新年献词|和合与共,生生不息

2024年12月30日&#xff0c;“和数新春会”在上海环球港凯悦酒店举行&#xff0c;和数集团董事长兼总经理唐毅、集团高管和市场骨干欢聚一堂&#xff0c;共迎新春。 告别收获的2024&#xff0c;迎来腾飞的2025。 回望来时路&#xff0c;我们在挑战中砥砺前行&#xff0c;在困…