1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| public enum OrderState { ;
private final OrderStatus currentStatus; private final OrderEvent event; private final OrderStatus nextStatus; private final Consumer<Order> action;
OrderState(OrderStatus currentStatus, OrderEvent event, OrderStatus nextStatus, Consumer<Order> action) { this.currentStatus = currentStatus; this.event = event; this.nextStatus = nextStatus; this.action = action; }
private static final Map<Transition, OrderState> TRANSITIONS = new HashMap<>();
static { TRANSITIONS.put( transition(DRAFT, PAY), new OrderState(DRAFT, PAY, PAID, Order::doPay) ); TRANSITIONS.put( transition(PAID, SHIP), new OrderState(PAID, SHIP, SHIPPED, Order::doShip) ); TRANSITIONS.put( transition(SHIPPED, RECEIVE), new OrderState(SHIPPED, RECEIVE, COMPLETED, Order::doComplete) ); }
public static OrderState transition(OrderStatus current, OrderEvent event, Order order) { Transition key = transition(current, event); OrderState state = TRANSITIONS.get(key);
if (state == null) { throw new IllegalStateException( String.format("无效转换: %s + %s -> ?", current, event) ); }
if (state.action != null) { state.action.accept(order); }
return state; }
private static Transition transition(OrderStatus s, OrderEvent e) { return new Transition(s, e); }
private static class Transition { final OrderStatus status; final OrderEvent event;
Transition(OrderStatus status, OrderEvent event) { this.status = status; this.event = event; }
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Transition that = (Transition) o; return status == that.status && event == that.event; }
@Override public int hashCode() { return Objects.hash(status, event); } } }
|