2013-06-25 126 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獨立於實際對象,管理所有轉換邏輯和驗證執行(您可以只需將一個完整的驗證引擎集成到您的狀態機中即可)