2

在我最近的项目中,我有一个Order类,它的属性将由不同的用户逐步完成,每个用户将部分完成的订单提交给下一个用户,所以我假设每个人每次Order都有一个Status,例如当一个Order创建时,其Status将是NewStatus,当为其指定 BOM(物料清单)时,其Status将是BOMAttachedStatus,当它计划生产时,其Status将是PlannedStatus,等等。 在此处输入图像描述

我还需要在每个步骤中应用一些验证规则Order,例如用户必须在创建Order( NewState) 时指定客户名称,或者用户必须在Order计划 ( PlannedStatus) 时设置 PlanningDate,...

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

在此处输入图像描述

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();
}

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

4

1 回答 1

1

这会起作用,但是您的设计和您所描述的内容存在一些问题。

  1. 在转换到每个状态的规则需要被触发并验证输入对象 - 你的设计不包括这个
  2. 状态更改不在任何地方进行管理,因此您将将该逻辑分散在 StateFacotry 或其他地方并手动处理。

我要做的是创建一个 StateMachine 类,您可以简单地调用 Transition 方法并提供一个目标 State。转换方法从 State 中查询以了解需要验证哪些规则并调用验证方法。如果成功,则它会更改对象的状态。

这种设计的好处:

  1. StateMachine 可以注册状态图 (S1->S2,S3 | S2->END | S3->S4 | S4->END)
  2. 状态转换基于寄存器图自动发生,并且
  3. 每个国家都知道需要满足哪些规则才能使过渡成功进行。(自我描述)
  4. StateMachine 没有公开状态如何转换的逻辑,并且全部封装在该实现中
  5. StateMAchine 独立于实际对象,并管理所有转换逻辑和验证执行(您可以简单地将完整的验证引擎集成到您的状态机中)
于 2013-09-18T04:11:43.153 回答