使用状态和工厂设计模式管理状态和验证规则

时间:2013-06-25 05:33:41

标签: c# validation state factory

在我最近的项目中,我有一个Order类,其属性将由不同的用户逐步完成,并且每个用户将部分完成的订单引用给下一个用户,所以我假设每个Order 1}}每次都有一个Status,例如当Order创建时,Status将为NewStatus,当为其指定BOM(物料清单)时,其Status将为BOMAttachedStatus,在计划生产时,其Status将为PlannedStatus,依此类推。 enter image description here

此外,我需要在Order的每个步骤中应用一些验证规则,例如,用户必须在创建OrderNewState)时指定客户名称,或者用户必须在Order时设置PlanningDate {1}}正在计划(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 个答案:

答案 0 :(得分:1)

这样可行,但是您的设计存在问题以及您所描述的内容。

  1. 在转换到每个州时,需要触发规则并验证输入对象 - 您的设计不包括此
  2. 状态更改不会在任何地方进行管理,因此您将在StateFacotry或其他地方分散该逻辑并手动处理它。
  3. 我想创建一个StateMachine类,您可以简单地调用Transition方法并提供目标状态。 转换方法从State查询以了解需要验证的规则并调用验证方法。如果成功则改变对象的状态。

    这种设计的好处:

    1. StateMachine可以注册状态图(S1-> S2,S3 | S2-> END | S3-> S4 | S4-> END)
    2. 状态转换根据寄存器图表和
    3. 自动发生
    4. 每个州都知道要成功完成转换需要满足哪些规则。 (自描述性的)
    5. StateMachine没有暴露逻辑如何转换状态以及所有封装在该实现中
    6. StateMAchine独立于实际对象,并管理所有转换逻辑和验证执行(您可以简单地将完整的验证引擎集成到您的状态机中)。