2013-06-25 54 views
2

在我最近的项目中,我有一个Order类,其属性将逐步由不同的用户完成步骤,以及每个用户是指部分完成的订单给下一个用户的状态和验证规则(S) ,所以我假定每个Order具有Status每个时间处,例如当一个Order创建,其StatusNewStatus,当BOM为其指定(物料清单),其StatusBOMAttachedStatus,当计划用于生产其Status将为PlannedStatus,依此类推。 enter image description here管理使用状态和工厂设计模式

此外,我需要适用于每个步骤的Order,例如用户的一些验证规则创建OrderNewState)时,必须指定客户姓名或用户必须设置PlanningDate时Order计划(PlannedStatus),...

所以,我决定用状态设计模式管理状态,并且还使用工厂设计模式检查验证:

enter image description here

public static class StatusFactory 
{ 
    static public IStatus CreateOrderStatus(Order order) 
    { 
      //check statuses from last to first 
      if (order.PlanningDate != null)  
       return new PlannedStatus(); 
       ....    
      if(order.CustomerName != string.Empty) 
       return new OrderItemNewState(); 
    } 
} 

,当我想救我currentOrder,我叫StateFactory.CreateOrderStatus(currentOrder)设置其Status

public void Save(Order order) 
{ 
    order.Status = StatusFactory.CreateOrderStatus(order); 
    UnitOfWork.SaveChanges(); 
} 

这是正确的方法,我的情况?有没有更好的解决方案?

回答

1

这将工作,但你必须与你的设计,你所描述的一些问题。

  1. 在过渡到每一个规则需要被解雇,验证输入对象的状态 - 你的设计不包括此
  2. 状态改变不管理任何地方,所以你要撒这个逻辑在StateFacotry或其他地方手动处理它。

我想创建一个StateMachine类,您可以简单地调用Transition方法并提供目标状态。 从状态的过渡方法查询知道规则需要加以验证,并调用验证方法。如果成功,它会改变对象的状态。

效益这种设计的:

  1. 的StateMachine可状态的曲线图寄存器(S1-> S2,S3 | S2-> END | S3-> S4 | S4-> END)
  2. 状态转变偏偏自动根据寄存器图和
  3. 每个国家都知道需要什么样的规则来满足,以允许过渡顺利发生。(自描述)
  4. StateMachine并未公开逻辑状态是如何转换的,并且在该实现中全部封装
  5. StateMAchine独立于实际对象,管理所有转换逻辑和验证执行(您可以只需将一个完整的验证引擎集成到您的状态机中即可)