电商中订单状态,不同的状态执行的逻辑动作不同;后期订单状态类型可能会增多,对应的逻辑动作也会增加,面对这种情况该如何设计代码。
以下是一种针对电商中订单状态及对应逻辑动作,且能较好应对后期状态类型增多、逻辑动作增加情况的代码设计思路,可通过状态模式结合策略模式来实现:
1. 状态模式实现订单状态管理
- 定义订单状态抽象类(接口)
- 创建一个抽象类(或接口),比如叫
OrderState
,它定义了与订单状态相关的通用方法,例如handle()
方法用于处理该状态下对应的逻辑动作。示例代码如下:
- 创建一个抽象类(或接口),比如叫
public interface OrderState {
void handle(Order order);
}
- 具体订单状态类实现
- 针对不同的订单状态,创建具体的实现类。例如有 “已下单”“已支付”“已发货”“已签收” 等状态,分别创建
OrderedState
、PaidState
、ShippedState
、ReceivedState
等类实现OrderState
接口。以 “已下单” 状态为例:
- 针对不同的订单状态,创建具体的实现类。例如有 “已下单”“已支付”“已发货”“已签收” 等状态,分别创建
public class OrderedState implements OrderState {
@Override
public void handle(Order order) {
// 这里编写“已下单”状态下的逻辑动作,比如发送下单确认短信、记录下单时间等
System.out.println("订单已下单,发送下单确认短信,记录下单时间等操作");
}
}
-
同理,在其他具体状态类中编写各自状态对应的逻辑动作,像 “已支付” 状态下可以进行更新支付状态、通知商家备货等操作。
-
订单类中关联状态
- 在
Order
(订单实体类)中,包含一个OrderState
类型的成员变量来表示当前订单所处的状态,并提供方法用于获取和设置状态。示例代码如下:
- 在
public class Order {
private OrderState state;
private String orderId;
// 其他订单相关属性,如商品信息、用户信息等省略
public Order() {
// 初始状态设为已下单状态,可根据实际情况调整
this.state = new OrderedState();
}
public void setState(OrderState state) {
this.state = state;
}
public OrderState getState() {
return state;
}
public void process() {
state.handle(this);
}
}
这样,通过改变订单对象的状态并调用 process()
方法,就能执行对应状态下的逻辑动作。
2. 策略模式处理不同状态下的具体逻辑动作
- 定义逻辑动作策略接口
- 创建一个接口,比如
OrderActionStrategy
,用于定义具体逻辑动作的通用规范,接口中有一个执行方法,如execute()
。示例代码如下:
- 创建一个接口,比如
public interface OrderActionStrategy {
void execute(Order order);
}
- 具体逻辑动作策略类实现
- 对于每个状态下不同的逻辑动作,分别创建对应的策略类实现
OrderActionStrategy
接口。比如在 “已下单” 状态下有发送短信的逻辑动作,创建SendSmsStrategy
类:
- 对于每个状态下不同的逻辑动作,分别创建对应的策略类实现
public class SendSmsStrategy implements OrderActionStrategy {
@Override
public void execute(Order order) {
// 具体实现发送短信的逻辑,比如调用短信发送接口等
System.out.println("执行发送短信操作,发送给用户下单确认短信");
}
}
- 然后在对应的
OrderState
实现类(如OrderedState
)中,可以组合使用这些策略类来完成该状态下的所有逻辑动作,示例代码如下:
public class OrderedState implements OrderState {
private List<OrderActionStrategy> actionStrategies = new ArrayList<>();
public OrderedState() {
// 初始化该状态下需要执行的逻辑动作策略,这里添加发送短信策略示例
actionStrategies.add(new SendSmsStrategy());
}
@Override
public void handle(Order order) {
for (OrderActionStrategy strategy : actionStrategies) {
strategy.execute(order);
}
}
}
3. 应对状态和逻辑动作增加的扩展性
- 新增订单状态
- 后期如果要增加新的订单状态,比如 “已退款” 状态,只需创建一个新的实现
OrderState
接口的类,如RefundedState
,在其中编写该状态对应的逻辑动作(通过组合相应的OrderActionStrategy
类)即可,无需修改原有订单状态相关代码,符合开闭原则。
- 后期如果要增加新的订单状态,比如 “已退款” 状态,只需创建一个新的实现
- 新增逻辑动作
- 若要为某个现有状态增加新的逻辑动作,比如在 “已支付” 状态下新增通知财务记账的逻辑动作,只需要创建一个新的
OrderActionStrategy
接口的实现类,如NotifyAccountingStrategy
,然后在对应的OrderState
实现类(PaidState
)中添加这个新策略到策略列表里,同样不会影响其他无关代码,方便扩展和维护。
- 若要为某个现有状态增加新的逻辑动作,比如在 “已支付” 状态下新增通知财务记账的逻辑动作,只需要创建一个新的
通过这样的设计,利用状态模式清晰地管理订单的不同状态以及其对应的逻辑动作切换,再借助策略模式灵活地应对每个状态下具体逻辑动作的增减变化,能让电商系统中的订单状态管理代码结构清晰、易于扩展和维护,较好地适应未来业务的发展变化。