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