写一个Java设计模式订单状态机
订单状态机是一种常见的设计模式,它用来描述一个订单在不同阶段的状态转换。在Java中,可以使用状态模式来实现订单状态机。
首先,定义一个订单状态接口,包含各种订单状态的方法:
public interface OrderState {
void confirm(Order order);
void cancel(Order order);
void ship(Order order);
void deliver(Order order);
}
然后,定义各种订单状态的实现类:
public class NewOrderState implements OrderState {
public void confirm(Order order) {
order.setState(new ConfirmedOrderState());
}
public void cancel(Order order) {
order.setState(new CancelledOrderState());
}
public void ship(Order order) {
throw new IllegalStateException("Cannot ship a new order");
}
public void deliver(Order order) {
throw new IllegalStateException("Cannot deliver a new order");
}
}
public class ConfirmedOrderState implements OrderState {
public void confirm(Order order) {
throw new IllegalStateException("Order already confirmed");
}
public void cancel(Order order) {
order.setState(new CancelledOrderState());
}
public void ship(Order order) {
order.setState(new ShippedOrderState());
}
public void deliver(Order order) {
throw new IllegalStateException("Cannot deliver an unshipped order");
}
}
public class ShippedOrderState implements OrderState {
public void confirm(Order order) {
throw new IllegalStateException("Order already shipped");
}
public void cancel(Order order) {
throw new IllegalStateException("Cannot cancel a shipped order");
}
public void ship(Order order) {
throw new IllegalStateException("Order already shipped");
}
public void deliver(Order order) {
order.setState(new DeliveredOrderState());
}
}
public class DeliveredOrderState implements OrderState {
public void confirm(Order order) {
throw new IllegalStateException("Order already delivered");
}
public void cancel(Order order) {
throw new IllegalStateException("Cannot cancel a delivered order");
}
public void ship(Order order) {
throw new IllegalStateException("Cannot ship a delivered order");
}
public void deliver(Order order) {
throw new IllegalStateException("Order already delivered");
}
}
public class CancelledOrderState implements OrderState {
public void confirm(Order order) {
throw new IllegalStateException("Order already cancelled");
}
public void cancel(Order order) {
throw new IllegalStateException("Order already cancelled");
}
public void ship(Order order) {
throw new IllegalStateException("Cannot ship a cancelled order");
}
public void deliver(Order order) {
throw new IllegalStateException("Cannot deliver a cancelled order");
}
}
最后,定义一个订单类,包含当前状态和状态转换方法:
public class Order {
private OrderState state;
public Order() {
state = new NewOrderState();
}
public void setState(OrderState state) {
this.state = state;
}
public void confirm() {
state.confirm(this);
}
public void cancel() {
state.cancel(this);
}
public void ship() {
state.ship(this);
}
public void deliver() {
state.deliver(this);
}
}
使用订单状态机:
Order order = new Order();
order.confirm();
order.ship();
order.deliver();
order.cancel();
这样,就可以根据订单的状态进行相应的操作,同时保证订单状态转换的正确性。
原文地址: https://www.cveoy.top/t/topic/7YN 著作权归作者所有。请勿转载和采集!