第六章 状态模式优化代码

目录

一、场景概述

二、状态模式优化代码


一、场景概述

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

因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生很多不必要的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, "未支付") {
        @Override
        public void nextState(Order order) { order.setState(PAID.code); }
    },
    // 已支付
    PAID(1, "已支付") {
        @Override
        public void nextState(Order order) { order.setState(FINISHED.code); }
    },
    // 已完成
    FINISHED(2, "已完成")  {
        @Override
        public 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就可以修改订单的状态。不过我们需要知道的是,这种优化的前提是状态变化的有序性。

相关推荐
名字还没想好☜1 天前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王1 天前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
一壶浊酒..1 天前
Scrape Webpack练习
开发语言·javascript·webpack
ZJH__GO1 天前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆1 天前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光1 天前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林1 天前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
命运之光1 天前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人1 天前
C# | Serilog 新手入门
开发语言·c#·.net·log
marvelyu1 天前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库