java 订单状态_JAVA设计模式-状态模式-State-订单状态

行为取决于它的状态,即是说由状态决定行为,方法放在状态类中,而状态控制亦在状态类中进行,譬如一个按钮,按一次是开,按一次是关,同一个行为,但是由于其状态的改变,而导致不同的结果。

一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

即是说以前你需要在某个行为的方法里面用if/else或者switch中写的一堆业务,现在可以转移到状态类中了,而该状态类是独立的,非常便于流程管理。譬如之前的开关,你需要在toggle()中写if/else,并且需要返回flag以便判断状态,而使用状态类,将状态分为开/关两种状态,只需要在状态类的toggle()方法中写入逻辑,将行为后的状态返回即可。

实现:

需要实现这个逻辑:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

那么我们就需要

3个具体状态类(已预订,已确认,已锁定)

以及3个行为(确认,修改,支付)

抽象状态类

abstract class OrderState {

abstract void confirm(OrderContext orderContext);

abstract void modify(OrderContext orderContext);

abstract void pay(OrderContext orderContext);

}

具体状态类

class OrderedState extends OrderState {

@Override

void confirm(OrderContext orderContext) {

System.out.println("订单已确认");

orderContext.setState(new ConfirmedState());

}

@Override

void modify(OrderContext orderContext) {

System.out.println("订单已修改");

orderContext.setState(this);

}

@Override

void pay(OrderContext orderContext) {

System.out.println("预定状态无法完成订单!");

}

}

class ConfirmedState extends OrderState {

@Override

void confirm(OrderContext orderContext) {

System.out.println("订单已确认,请勿重复确认");

}

@Override

void modify(OrderContext orderContext) {

System.out.println("订单已修改,请再次确认");

orderContext.setState(new OrderedState());

}

@Override

void pay(OrderContext orderContext) {

System.out.println("订单已支付,无法再修改");

orderContext.setState(new LockedState());

}

}

class LockedState extends OrderState {

@Override

void confirm(OrderContext orderContext) {

System.out.println("订单已锁定");

}

@Override

void modify(OrderContext orderContext) {

System.out.println("订单已锁定");

}

@Override

void pay(OrderContext orderContext) {

System.out.println("订单已锁定");

}

}

背景类

class OrderContext {

OrderState state = null;

//新建订单设为已预定状态

OrderContext() {

this.state = new OrderedState();

}

void setState(OrderState state) {

this.state = state;

}

public void confirm() {

state.confirm(this);

}

public void modify() {

state.modify(this);

}

public void pay() {

state.pay(this);

}

}测试:

public static void main(String[] args) {

OrderContext orderContext = new OrderContext();

orderContext.confirm(); //已预定状态>已确认状态

orderContext.modify(); //已确认状态>已预定状态

orderContext.confirm(); //已预定状态>已确认状态

orderContext.pay(); //已确认状态>已锁定状态

orderContext.modify(); //已锁定状态

}

订单已确认

订单已修改,请再次确认

订单已确认

订单已支付,无法再修改

订单已锁定

你可能感兴趣的:(java,订单状态)