原理:使用的是设计模式中的状态模式。
优点:利于扩展,写更多的状态也没问题,不用各种ifelse的条件判断,缺点:需要每个状态写一个类
假设我都我有一个订单,其中有几个状态:下单、配送、完成
我要严格控制这几个状态的变更、环节日志的记录、任务日志的记录等,当然还可以有别的操作,比如发短信
订单状态
public interface OrderState {
/**
* 已下单
*/
String PLACED = "order_placed";
/**
* 配送中
*/
String ORDER_DELIVERING = "order_delivering";
/**
* 已完成/收货
*/
String FINISHED = "order_finished";
}
状态基类
@Getter
@Setter
public abstract class OrderInfoState {
protected OrderInfo orderInfo;
public String getOrderState() {
return "order_placed";
}
abstract void printFlowLog();
abstract void printTaskLog();
}
完成状态
public class OrderFinishState extends OrderInfoState {
@Override
public String getOrderState() {
return OrderState.FINISHED;
}
@Override
void printFlowLog() {
System.out.println("订单已经完成");
}
@Override
void printTaskLog() {
System.out.println("订单已经竣工");
}
}
配送状态
public class OrderDispatchState extends OrderInfoState {
@Override
public String getOrderState() {
if(!OrderState.PLACED.equals(orderInfo.getOrderState())) {
throw new UserClientException("目前状态是" + orderInfo.getOrderState()+"不能推进到派单环节");
}
return OrderState.ORDER_DELIVERING;
}
@Override
void printFlowLog() {
System.out.println("xxx工程师准备正在上门");
}
@Override
void printTaskLog() {
System.out.println("派单给xxx");
}
}
下单状态
public class OrderPlaceState extends OrderInfoState {
@Override
public String getOrderState() {
return OrderState.PLACED;
}
@Override
void printFlowLog() {
System.out.println("您已经下单了");
}
@Override
void printTaskLog() {
System.out.println("已经下单了");
}
}
订单实体类
@Getter
@Setter
public class OrderInfo extends LongAuditModel<OrderInfo> {
/**
* 订单状态
*/
@TableField(value = "order_state")
private String orderState;
public void changeState(OrderInfoState state) {
state.setOrderInfo(this);
setOrderState(state.getOrderState());
state.printFlowLog();
state.printTaskLog();
System.out.println(getOrderState());
}
}
使用:
public class Test {
public static void main(String[] args) {
OrderInfo orderInfo = new OrderInfo();
orderInfo.changeState(new OrderPlaceState()); //修改为下单状态
orderInfo.changeState(new OrderDispatchState()); //修改为配送状态
orderInfo.changeState(new OrderFinishState()); //修改为完成状态
}
}
------------运行结果-------------
您已经下单了
已经下单了
order_placed
xxx工程师准备正在上门
派单给xxx
order_delivering
订单已经完成
订单已经竣工
order_finished
总结:
不使用这样的状态模式当然可以达到功能,但是会有一些ifelse或者switch的条件判断,状态越多语句越多,需要做的功能越多代码也越多,比较凌乱。
像这样使用状态模式会大大增强代码的阅读性,代码质量,特别是状态和功能点多或者状态变更每次都有前状态要求时,用此方法是比较好的。但是状态少功能点少可以就没必要了
读者可根据自身情况自行选择