2010-11-12 29 views
4

我上調用複雜邏輯的決策系統的設計工作正確的設計模式,可能我會需要使用大量的嵌套if/else語句,什麼是對複雜的決策系統

我想看看是否有更好的設計模式,可以幫助我簡化系統結構併爲將來的改進提供一定的可擴展性。

該項目的問題可以simpified爲:

我們現在需要以期對請求,其中有3個類型的屬性,而且可能更決定。他們是PricePolicy(合同/ WholeSale /零售/折扣),RequestType(買/賣)和ProductType(時尚/家用/玩具)。

每個決策都基於請求的所有3個屬性,因爲價格策略的類型可能會在將來發生變化,更多的屬性將被添加到決策過程中。

所以我試圖避免做一個大的switch語句,這對於未來的擴展來說是醜陋的和困難的。如:

switch(ProductType) { 
case Fashion: 
    switch(PricePolicy) { 
    case Contract: 
     if(Request == Buy) { 
     // making a decision. 
     } else { 
     } 
    } 
    } 
} 

請分享您的想法和建議謝謝。

乾杯, 鮑勃

+0

對於這種系統Prolog是你的朋友 – Enrique 2010-11-12 18:42:32

回答

6

也許你想要一個Rete算法的規則引擎。嘗試Drools。

或數據驅動的決策表。

如果您想要一個類的解決方案,請考慮多態性。將所有這些if/then/else案例替換爲Strategy或Visitor等類。

關鍵是穩定的接口。如果你能保持穩定,並改變下面的實現,那麼你已經掌握了它。

+0

我喜歡多態,但它增加了垂直依賴性,所以如果我想改變基類的方法簽名。所有的繼承類都必須改變。 – Bob 2010-11-12 18:35:25

+0

我在想,如果我們可以減少垂直依賴... – Bob 2010-11-12 18:36:05

+0

+1提及Drools – mgv 2010-11-12 18:38:24

0

使用n維數組,並以這種方式查找/查詢/修改您的決定。

+0

這是避免switch語句的一種巧妙方式,但從設計角度來看,我相信我們仍然使用相同的switch語句,只是更智能。 我們必須將操作硬編碼到索引中。你是這麼認爲的... – Bob 2010-11-12 18:39:44

0

正如ziplin的建議,如果每個組合都有一個決策(即不是'稀疏'的決策分佈 - 我認爲這是正確的術語),我會考慮一個3d數組。這將要求您能夠將決策邏輯封裝在可存儲在數組中的表達式中。通過稀疏分佈,可以以類似的方式使用鄰接列表。