订单的状态机模式

谈到设计模式,其实在代码逻辑简单的时候完全没有优势,写的代码又多,逻辑又有点饶。但是在大型业务系统,它的优势就体现出来了,面向对象设计,更重要的是思路的转变,而不只是简单业务的面向过程思维。下面就介绍一下订单业务场景的状态机模式实现。

订单的状态机模式_第1张图片
涉及3个具体状态类(已预订,已确认,已锁定)
以及3个行为(确认,修改,支付)

首先定义一个订单领域模型

public class Order {
    private int money;

    private OrderState orderState;

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public OrderState getOrderState() {
        return orderState;
    }

    public void setOrderState(OrderState orderState) {
        this.orderState = orderState;
    }
 }

订单状态接口为

public interface OrderState {
    void confirm(Order order);
    void modify(Order order);
    void pay(Order order);

}

预定状态

public class OrderedState implements OrderState{


    @Override
    public void confirm(Order order) {
        System.out.println("订单已确认");
        order.setOrderState(new ConfirmedState());
    }

    @Override
    public void modify(Order order) {
        System.out.println("订单已修改");
    }

    @Override
    public void pay(Order order) {
        System.out.println("预定状态无法完成订单!");
    }
}

确认状态

public class ConfirmedState implements OrderState{


    @Override
    public void confirm(Order order) {
        System.out.println("订单已确认,请勿重复确认");
    }

    @Override
    public void modify(Order order) {
        System.out.println("订单已修改,请再次确认");
        order.setOrderState(new OrderedState());
    }

    @Override
    public void pay(Order order) {
        System.out.println("订单已支付,无法再修改");
        order.setOrderState(new LockedState());
    }
}

锁定状态

public class LockedState implements OrderState{


    @Override
    public void confirm(Order order) {
        System.out.println("订单已锁定");
    }

    @Override
    public void modify(Order order) {
        System.out.println("订单已锁定");
    }

    @Override
    public void pay(Order order) {
        System.out.println("订单已锁定");
    }
}

测试

public static void main(String[] args) {
        Order order=new Order();
        order.setOrderState(new OrderedState());

        order.getOrderState().pay(order);

        order.getOrderState().confirm(order);
        order.getOrderState().modify(order);
        order.getOrderState().confirm(order);
        order.getOrderState().pay(order);
        order.getOrderState().modify(order);
    }

输出

预定状态无法完成订单!
订单已确认
订单已修改,请再次确认
订单已确认
订单已支付,无法再修改
订单已锁定

也有人把行为直接放到order模型里,这样有个坏处就是一个状态有多个行为时处理逻辑较复杂,如果只是单个行为,那它的优势就体现出来了。

你可能感兴趣的:(java)