State Pattern 状态模式和Dao的耦合困惑


如图,订单状态有New Order,Registered,Granted,Shipped,Invoiced,Cancelled,相当复杂,在不同的状态执行操作时会产生不同的影响,比如说我们要执行AddOrderLine的话,要判断订单状态,如果是Registered或Granted状态的话,订单状态会变成New Order,如果是New Order状态的话,则状态保持不变,如果是其它状态的话,则不允许AddOrderLine操作。

运用状态模式之后,

但是问题来了,例如Granted状态在执行ship()操作之后变成Shipped状态,但是ship()操作涉及到减少库存,写出库记录等等内容,这样GrantedState就要依赖于 库存Dao 了,这样会产生一个Entity 依赖高层的Dao的问题了。
请问大家应该怎么解决?

public class GrantedState extends OrderState
{
ship(){
InventoryDao.reduceInventory(Order);
}
}

2010年10月05日 12:55 "jfans"的内容
这样GrantedState就要依赖于 库存Dao 了,这样会产生一个Entity 依赖高层的Dao的问题了 ...

状体切换复杂,很显然使用状态机来封装,但是状态机中要涉及到数据库DAO的操作,怎么办?肯定是不能在状态机中耦合依赖数据库操作的。

这个时候,领域事件Domain events就派上用处,由参与状态机的领域模型对象发出领域事件,在事件消息接受一方使用DAO操作数据库,这样通过引入消息事件将对象设计和具体数据库技术实现解耦。

具体domain events可见jdonframework,或者这篇文章:
基于EDA和CQRS的拍卖案例