小编nic*_*083的帖子

状态模式:当一个对象参与复杂过程时,它们的状态应如何转换?

我对状态模式的以下实现有一些疑问:

我有一个Order对象.为简单起见,我们假设它有一个数量,productId,价格和供应商.此外,订单可以转换有一组已知状态:

  • 状态a:订单是新的,数量必须> 0并且必须具有productId.价格和供应商尚未分配.
  • b:有人检查订单.它只能被取消,或者分配供应商.
  • 州c:供应商只能填写要向客户收取的价格.
  • 状态d:订单被取消.

1)Order.isValid()在状态之间变化.即,在状态中,一些操作无法完成.所以,它们看起来像:
void setQuantity(int q){
if(_state.canChangeQuantity())this.quantity = q;
否则抛出异常.
}
这是正确的,或者我应该得到每个国家实施setQuantity操作?在那种情况下,哪里会存储值?在顺序,还是国家?在后一种情况下,我将不得不在每个状态转换中复制数据?

2)orderProcessor.process(order)是一个检查order.IsValid的对象,将订单转换为某个状态,将其保存到db并执行一些自定义操作(在某些状态下,admin会通知,在其他状态下会通知客户端等) .每个州都有一个.
在StateAOrderProcessor中,通过电子邮件通知检查订单的人员,订单将转换为状态b.
现在,这将推动Order类之外的状态转换.这意味着Order有一个'setState'方法,因此每个处理器都可以改变它.这个从外面改变状态的事情听起来不太好听.这是对的吗?

3)Ahother选项是将所有验证逻辑移动到每个州的处理器,但现在我必须跟踪订单数量的变化,以查看该操作在当前状态下是否有效. 这让我的订单变得贫血.

你们觉得怎么样?你能给我一些建议来更好地设计这件事吗?

非常感谢你.

缺口

state design-patterns

10
推荐指数
2
解决办法
6852
查看次数

标签 统计

design-patterns ×1

state ×1