第六章 状态模式优化代码

目录

一、场景概述

二、状态模式优化代码


一、场景概述

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

因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生很多不必要的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就可以修改订单的状态。不过我们需要知道的是,这种优化的前提是状态变化的有序性。

相关推荐
世辰辰辰13 分钟前
批量修改图片/文本名子
开发语言·python·批量修改文件名
郑洁文26 分钟前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
螺丝钉code1 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
z落落2 小时前
C# 四种特殊类:抽象类、密封类、静态类、部分类
开发语言·c#
摇滚侠2 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea
VidDown3 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
折哥的程序人生 · 物流技术专研3 小时前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则
装不满的克莱因瓶3 小时前
基于 OpenResty 扩展开发实现动态服务注册与发现能力
java·开发语言·架构·openresty
程序员小羊!3 小时前
06Java 异常机制与常用类
java
weixin_523185324 小时前
Java基础知识总结(四):引用数据类型与参数传递机制
java·开发语言·python