目录
一、场景概述
二、状态模式优化代码
一、场景概述
我们在日常开发过程中一定会遇到下述场景:业务中有类似订单这样需要修改状态的功能模块,订单状态的修改变化为 未支付 -> 已支付 -> 已完成
因此我们每次在修改状态之前,都得先判断下现有的订单状态值是多少,这样就会的导致代码中产生很多不必要的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就可以修改订单的状态。不过我们需要知道的是,这种优化的前提是状态变化的有序性。