网站加图标,wordpress怎么换语言,大连建立网页,查网站权重目录
1. 概念
2. 定义状态机
3. 生成一个状态机
4. 使用 1. 概念 在Java的应用开发里面#xff0c;应该会有不少的人接触到一个业务场景下#xff0c;一个数据的状态会发生多种变化#xff0c;最经典的例子例如订单#xff0c;当然还有像用户的状态变化#xff08;冻结…目录
1. 概念
2. 定义状态机
3. 生成一个状态机
4. 使用 1. 概念 在Java的应用开发里面应该会有不少的人接触到一个业务场景下一个数据的状态会发生多种变化最经典的例子例如订单当然还有像用户的状态变化冻结销户等文章的状态变化已发布草稿等。像这些具有多种状态的事物如果我们不进行一些措施来进行维护和扩展的话那么将会导致状态越难越难以管理而且对状态的转变也会越来越难以定义。 那么讲出了它现在存在的问题也就能大概知道本文要讲的是主要内容是什么了。没错状态机就是用来规范使用状态的各种变化的一种产物。 可能大家还不清楚这个玩意为什么产生我给大家一个场景如果没有一种严格的状态机控制那么像订单这种我们是不是可以直接从已下单的状态直接推进到已发货的状态而越过中间的支付等等的中间状态。这显然是有问题的。 在状态机当中具有四个概念用来控制状态的变化。一种状态需要迁移到下一种状态一定是经过某种行为或者事件转化到下一个状态。所以这也就成为了状态机的核心概念。 状态States代表系统可能处于的各种状态例如 已下单、已支付、已发货 等。 事件Events触发状态转换的事件例如 下单、支付、发货 等。 动作Actions在状态转换发生时执行的操作或行为。 转换Transitions定义状态之间的转换规则即在某个事件发生时系统从一个状态转换到另一个状态的规则
2. 定义状态机
我们可以定义一个状态机并声明两个变量一个用来记录状态变化的记录一个用来记录要经过下一个状态需要的源状态与事件。在生成一个状态机的过程我们将记录他需要变化的所有的状态事件以及转换。
public class StateMachine {private MapString,String translatedTransitionsMap new HashMap();private SetString translatedTransitions new HashSet();private static final String DEFAULT_DELIMITER -;public StateMachine(Transition[] transitions){for (Transition transition : transitions) {translatedTransitions.add(transition.getFrom() DEFAULT_DELIMITER transition.getEvent() DEFAULT_DELIMITER transition.getTo());if(translatedTransitionsMap.containsKey(transition.getFrom() DEFAULT_DELIMITER transition.getEvent())){throw new RuntimeException(Duplicate transition found: transition.getFrom() DEFAULT_DELIMITER transition.getAction());}translatedTransitionsMap.put(transition.getFrom() DEFAULT_DELIMITER transition.getEvent(),transition.getTo());}}public String getNextState(String from, String event){return translatedTransitionsMap.get(from DEFAULT_DELIMITER event);}public boolean checkTransitions(String from, String even){return translatedTransitions.contains(from DEFAULT_DELIMITER event);}}过渡类的内容为
Data
AllArgsConstructor
NoArgsConstructor
public class Transition {/*** 起始状态*/private String from;/*** 动作*/private String even;/*** 目标状态*/private String to;}3. 生成一个状态机
我们此次以订单举例生成一个订单的状态机
public class OrderStatusModel {private static StateMachine ORDEER_STATEMACHINE;static {ORDEER_STATEMACHINE new StateMachine(new Transition[]{new Transition(TradeStatusEnum.NEW.getStatus(), TradeEventEnum.CONFIRM.name(), TradeStatusEnum.WAIT_PAY.getStatus()),new Transition(TradeStatusEnum.NEW.getStatus(), TradeEventEnum.CANCEL.name(), TradeStatusEnum.CLOSED.getStatus()),new Transition(TradeStatusEnum.WAIT_PAY.getStatus(), TradeEventEnum.PAY.name(), TradeStatusEnum.PAY_SUCCESS.getStatus()),new Transition(TradeStatusEnum.WAIT_PAY.getStatus(), TradeEventEnum.PAY_CANCEL.name(), TradeStatusEnum.CANCELLED.getStatus()),new Transition(TradeStatusEnum.PAY_SUCCESS.getStatus(), TradeEventEnum.CONFIRM_SUCCESS.name(), TradeStatusEnum.COMPLETED.getStatus())});}public static String getTargetStatus(TradeStatusEnum currentStatus, TradeEventEnum tradeEventEnum) {return ORDEER_STATEMACHINE.getNextState(currentStatus.getStatus(), tradeEventEnum.name());}}订单状态枚举
Getter
public enum TradeStatusEnum {/*** 新建订单*/NEW(NEW, 新建订单),/*** 锁单成功-待支付状态*/WAIT_PAY(WAIT_PAY, 待支付),/*** 支付成功*/PAY_SUCCESS(PAY_SUCCESS, 支付成功),/*** 已完成*/COMPLETED(COMPLETED,已完成),/*** 已取消*/CANCELLED(CANCELLED,已取消),/*** 订单关闭*/CLOSED(CLOSED,订单关闭);private String status;private String desc;TradeStatusEnum(String status, String desc) {this.status status;this.desc desc;}
}
订单事件
public enum TradeEventEnum {/*** 订单确认*/CONFIRM,/*** 取消订单*/CANCEL,/*** 支付*/PAY,/*** 支付取消*/PAY_CANCEL,/*** 订单确认成功*/CONFIRM_SUCCESS,/*** 订单完成*/FINISH
}
4. 使用
Data
public class TradeOrder {private String orderId;private String status;private double price;public TradeOrder confirm(TradeCreateRequest request) {this.setStatus(OrderStatusModel.getTargetStatus(request.getTradeStatus(), TradeEventEnum.CONFIRM));return this;}public TradeOrder pay(TradeWaitPayRequest request) {this.setStatus(OrderStatusModel.getTargetStatus(request.getTradeStatus(), TradeEventEnum.CANCEL));return this;}
}传参为
public class TradeCreateRequest extends BaseResquest{Overridepublic TradeStatusEnum getTradeStatus(){return TradeStatusEnum.NEW;}
}public abstract class BaseResquest {abstract TradeStatusEnum getTradeStatus();
}