目录
一、场景概述
二、状态模式优化代码
一、场景概述
我们在日常开发过程中肯定会遇到下述场景:业务中有类似订单这样需要修改状态的功能模块,订单状态的修改变革为 未付出 -> 已付出 -> 已完成
因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生许多不必要的if set语句,非常的不优雅。
- 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();
- }
- }
复制代码- 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();
- }
- }
复制代码- 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());
- }
- }
- }
复制代码 二、状态模式优化代码
- 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);
- }
复制代码- 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);
- }
- }
复制代码- 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就可以修改订单的状态。不过我们需要知道的是,这种优化的条件是状态变革的有序性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |