第六章 状态模式优化代码

server/2024/12/16 18:30:08/

目录

一、场景概述

二、状态模式优化代码


一、场景概述

我们在日常开发过程中一定会遇到下述场景:业务中有类似订单这样需要修改状态的功能模块,订单状态的修改变化为 未支付 -> 已支付 -> 已完成

因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生很多不必要的if set语句,非常的不优雅。

java">package com.example.enums;import java.util.Arrays;/*** 订单枚举类*/
public enum OrderStateEnum {// 未支付UNPAY(0, "未支付"),// 已支付PAID(1, "已支付"),// 已完成FINISHED(2, "已完成");private Integer code;private String value;OrderStateEnum(Integer code, String value) {this.code = code;this.value = value;}public Integer getCode() {return code;}public String getValue() {return value;}public static OrderStateEnum byCode(Integer code) {return Arrays.stream(values()).filter(t -> t.getCode().equals(code)).findFirst().get();}
}
java">package com.example.domain.po;import com.example.enums.OrderStateEnum;
import lombok.Data;@Data
public class Order {private Long id;private String orderNo;private Integer state;public Order() {state = OrderStateEnum.UNPAY.getCode();}
}
java">package com.example;import com.example.domain.po.Order;
import com.example.enums.OrderStateEnum;public class Test {// Order 未支付 -> 已支付 -> 已完成public static void main(String[] args) {Order order = new Order();if (order.getState() == OrderStateEnum.UNPAY.getCode()) {order.setState(OrderStateEnum.PAID.getCode());}}
}

二、状态模式优化代码

java">package com.example.enums;import com.example.domain.po.Order;
import java.util.Arrays;/*** 订单枚举类*/
public enum OrderStateEnum {// 未支付UNPAY(0, "未支付") {@Overridepublic void nextState(Order order) { order.setState(PAID.code); }},// 已支付PAID(1, "已支付") {@Overridepublic void nextState(Order order) { order.setState(FINISHED.code); }},// 已完成FINISHED(2, "已完成")  {@Overridepublic void nextState(Order order) { order.setState(PAID.code); }};private Integer code;private String value;OrderStateEnum(Integer code, String value) {this.code = code;this.value = value;}public Integer getCode() {return code;}public String getValue() {return value;}public static OrderStateEnum byCode(Integer code) {return Arrays.stream(values()).filter(t -> t.getCode().equals(code)).findFirst().get();}public abstract void nextState(Order order);
}
java">package com.example.domain.po;import com.example.enums.OrderStateEnum;
import lombok.Data;@Data
public class Order {private Long id;private String orderNo;private Integer state;public Order() {state = OrderStateEnum.UNPAY.getCode();}public void nextState() {OrderStateEnum.byCode(state).nextState(this);}
}
java">package com.example;import com.example.domain.po.Order;public class Test {// Order 未支付 -> 已支付 -> 已完成public static void main(String[] args) {Order order = new Order();System.out.println(order.getState());order.nextState();System.out.println(order.getState());order.nextState();System.out.println(order.getState());}
}

通过上述的优化后,我们在业务代码中的状态值修改就变得非常简洁,,直接调用nextState就可以修改订单的状态。不过我们需要知道的是,这种优化的前提是状态变化的有序性。


http://www.ppmy.cn/server/150692.html

相关文章

React基础学习

React基础 📣 📣 📣 📢📢📢 ☀️☀️点开就是缘分认识一下,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#x…

OpenCV中的图片矫正

一、实验原理 基于计算机视觉中的透视变换(Perspective Transformation),也称为单应性(Homography)。透视变换是一种几何变换,用于将图像从一个平面映射到另一个平面,同时保持直线的直线性。这种…

【机器学习算法】——决策树之集成学习:Bagging、Adaboost、Xgboost、RandomForest、XGBoost

集成学习 **集成学习(Ensemble learning)**是机器学习中近年来的一大热门领域。其中的集成方法是用多种学习方法的组合来获取比原方法更优的结果。 使用于组合的算法是弱学习算法,即分类正确率仅比随机猜测略高的学习算法,但是组合之后的效果仍可能高于…

uniapp h5 js设置监听:超时未操作返回首页(全局只监听一次,可设置监听事件+检查时间+超时时长)

功能实现: 可自定义超时时长,检查时间超时后跳转首页(/pages/home/index/index); 如果在首页,则不进行跳转监控状态下, 用户有任意操作(包括但不限于点击,滑动,跳转页面等),则重置监听,重新开始算时间超时方法及逻辑封装到单独的js文件中 全局只需在app.vue创建监听,其他页面无…

leetcode 面试经典 150 题:移除元素

链接移除元素题序号27类型数组解题方法双指针难度简单 题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要…

聊聊Oracle自适应查询优化

成也AQO败也AQO 因为工作的原因,我们接触到的客户大部分是金融和运营商行业,这些客户有个最大的特点是追求稳定,对于使用数据库新特性持保守的态度,不会轻易尝试某些可能会导致生产系统不稳定的新特性。上线前通常都会将一些新特…

SpringBoot【十】mybatis之xml映射文件>、<=等特殊符号写法!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 在利用mybatis进行开发的时候&#xff0c;编写sql时可能少不了>、<等比较符号&#xff0c;但是在mapper映射文件中直接使用是不行的&#xff0c;会报错&#xff0…

Guava库 学习入门--概览与入门

Guava库的介绍 Guava库是由Google开发的Java开源库&#xff0c;它的主要目的是简化常见的编程任务&#xff0c;提供高效的数据处理方法。Guava库中的功能覆盖了从集合操作、缓存、函数式编程、并发编程以及其他诸多实用的工具类。 Guava的安装与依赖配置 Guava库可以通过Mav…