状态模式实战运用

目录

前言

UML

plantuml

类图

实战代码

Form

State

Client


前言

通常一个完整的业务流程中,会经历多个阶段,每个阶段即一个业务状态,不同状态下对应这不同的业务处理逻辑。

无脑堆砌 if else 做判断然后选择对应的业务处理其实也能够完成该需求,只不过这样写代码不够优雅。使用状态模式来处理这种业务场景,能让程序可读性更好,易于维护和扩展。

状态模式和策略模式从 UML 上看其实是一样的,很容易混淆。

两者的区别就是策略模式下的策略是由客户端自主选择的,且每个策略之间并没有任何关系;而状态模式下的状态之间是可以互相转换的,每个状态下的行为除了必要的业务处理外,还会涉及到状态转化。

UML

plantuml

@startuml
'https://plantuml.com/class-diagraminterface State {+ next(Context) : void+ prev(Context) : void
}class StateA {+ next(Context) : void+ prev(Context) : void
}class StateB {+ next(Context) : void+ prev(Context) : void
}class Context {- state : State+ Context(State)+ next() : void+ prev() : void
}State <|.. StateA
State <|.. StateBContext "1" --> "1" State@enduml

类图

实战代码

业务流程存在三个状态 INIT,PROCESSING,COMPLETE

每个状态可以通过下一步,上一步来进行状态转化

使用枚举类来实现状态模式如下所示

Form

public class Form {int state;Form() {state = 1;}public int getState() {return state;}public void setState(int state) {this.state = state;}
}

State

public enum State {INIT(1, "初始化") {public void nextStep(Form form) {//其他业务操作form.setState(PROCESSING.getValue());}public void preStep(Form form) {throw new RuntimeException("已经是最初状态,无法上一步");}},PROCESSING(2, "处理中") {public void nextStep(Form form) {//其他业务操作form.setState(COMPLETE.getValue());}public void preStep(Form form) {//其他业务操作form.setState(INIT.getValue());}},COMPLETE(3, "完成") {public void nextStep(Form form) {throw new RuntimeException("已经是最终状态,无法下一步");}public void preStep(Form form) {//其他业务操作form.setState(COMPLETE.getValue());}};private final Integer value;private final String desc;private static final Map<Integer, State> map = Arrays.stream(values()).collect(toMap(State::getValue, e -> e));private State(Integer value, String desc) {this.value = value;this.desc = desc;}public Integer getValue() {return this.value;}public String getDesc() {return this.desc;}public void nextStep(Form form) {}public void preStep(Form form) {}public static State getEnum(Integer value) {return map.get(value);}
}

Client

public class Client {public static void main(String[] args) {Form form = new Form();State state = State.getEnum(form.getState());state.nextStep(form);System.out.println(form.getState());state = State.getEnum(form.getState());state.nextStep(form);System.out.println(form.getState());state.preStep(form);System.out.println(form.getState());}
}

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

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

相关文章

Hive-技术补充-ANTLR的真实语法世界

一、上下文 上一篇博客<Hive-技术补充-ANTLR语法编写>&#xff0c;我们了解了如何使用ANTLR语法来表达词法结构和语法结构&#xff0c;下面我们循循渐进的处理身边用过的一些文件或语言&#xff1a; CSV、JSON、DOT、Cymbol、R 二、解析CSV文件 有这样一份csv文件 …

Hadoop面试重点

文章目录 1. Hadoop 常用端口号2.Hadoop特点3.Hadoop1.x、2.x、3.x区别 1. Hadoop 常用端口号 hadoop2.xhadoop3.x访问HDFS 端口500709870访问 MR 执行情况端口80888088历史服务器1988819888客户端访问集群端口90008020 2.Hadoop特点 高可靠&#xff1a;Hadoop底层维护多个数…

移动端开发思考:Uniapp的上位替代选择

文章目录 前言跨平台开发技术需求技术选型uniappFlutterMAUIAvalonia安卓原生 Flutter开发尝试Avalonia开发测试测试项目新建项目代码MainViewMainViewModel 发布/存档 MAUI实战&#xff0c;简单略过打包和Avalonia差不多 总结 前言 作为C# .NET程序员&#xff0c;我有一些移动…

【浅尝C++】使用模板实现泛型编程第一弹=>函数模板/类模板/模板匹配原则/函数模板原理

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f6a9;一些备注&#xff1a;之前的文章有点杂乱&#xff0c;这里将前面的知识点重新组织了&#xff0c;避免了过多冗余的废话。 &#x1f3af;每日努力一点点&#xff0c;技术变化看…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

京东云0基础搭建帕鲁服务器_4核16G和8核32G幻兽帕鲁专用服务器

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程&#xff0c;非常简单&#xff0c;京东云推出幻兽帕鲁镜像系统&#xff0c;镜像直接选择幻兽帕鲁镜像即可一键自动部署&#xff0c;不需要手动操作&#xff0c;真正的新手0基础部署幻兽帕鲁&#xff0c;阿腾云atengyun.…

go的通信Channel

go的通道channel是用于协程之间数据通信的一种方式 一、channel的结构 go源码&#xff1a;GitHub - golang/go: The Go programming language src/runtime/chan.go type hchan struct {qcount uint // total data in the queue 队列中当前元素计数&#xff0c;…

IDEA一键备份MySQL数据库(mysqldump版)

问题 又到了搬MySQL数据库的时刻&#xff0c;这次我不想使用命令行备份&#xff0c;这次我想使用IDEA一键备份MySQL数据库。 解决 假设安装好mysqldump命令后&#xff0c;让IDEA使用mysqldump一键备份指定的数据库。具体IDEA配置如下&#xff1a; 这是IDEA上面的数据库到处…

typescript 实现RabbitMQ死信队列和延迟队列 订单10分钟未付归还库存

Manjaro安装RabbitMQ 安装 sudo pacman -S rabbitmq rabbitmqadmin启动管理模块 sudo rabbitmq-plugins enable rabbitmq_managementsudo rabbitmq-server管理界面 http://127.0.0.1:15672/ 默认用户名和密码都是guest。 要使用 rabbitmqctl 命令添加用户并分配权限&#xf…

云数据仓库Snowflake论文完整版解读

本文是对于Snowflake论文的一个完整版解读&#xff0c;对于从事大数据数据仓库开发&#xff0c;数据湖开发的读者来说&#xff0c;这是一篇必须要详细了解和阅读的内容&#xff0c;通过全文你会发现整个数据湖设计的起初原因以及从各个维度&#xff08;架构设计、存算分离、弹性…

使用Apache Flink实现MySQL数据读取和写入的完整指南

1. 导言&#xff1a; Apache Flink是一款功能强大的流式处理引擎&#xff0c;可用于实时处理大规模数据。本文将介绍如何使用Flink与MySQL数据库进行交互&#xff0c;以清洗股票数据为例。 2. 环境准备&#xff1a; 首先&#xff0c;确保已安装Apache Flink并配置好MySQL数据…

如何为企业策划一场XR虚拟直播?

活动年年办&#xff0c;都是老一套&#xff0c;想玩点新花样&#xff1f; 预算有限&#xff0c;但还是想把活动办的逼格高一点&#xff1f; 想通过活动&#xff0c;让更多的人知道自己企业的品牌&#xff1f; 随着AIGC技术的不断演变&#xff0c;企业活动的形式和内容也在不…