谈到设计模式,其实在代码逻辑简单的时候完全没有优势,写的代码又多,逻辑又有点饶。但是在大型业务系统,它的优势就体现出来了,面向对象设计,更重要的是思路的转变,而不只是简单业务的面向过程思维。下面就介绍一下订单业务场景的状态机模式实现。
涉及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模型里,这样有个坏处就是一个状态有多个行为时处理逻辑较复杂,如果只是单个行为,那它的优势就体现出来了。