复杂决策系统的正确设计模式是什么?

4

我正在设计一个决策系统,它调用复杂的逻辑,可能需要使用大量嵌套的if/else语句。

我想看看是否有更好的设计模式可以帮助我简化系统结构,并为未来的改进提供一定的可扩展性。

该项目的问题可以简化为:

我们现在需要为一个请求做出决策,该请求具有3种属性,以及可能会增加更多。它们是价格策略(合同/批发/零售/折扣)、请求类型(购买/销售)和产品类型(时尚/家居/玩具)。

每个决策都基于请求的所有3个属性,因为价格策略的类型可能会在未来更改,并且将向决策过程添加更多属性。

因此,我试图避免制作一个大型的switch语句,这样做既难看,也不利于未来的扩展。例如:

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

请分享您的想法和建议,谢谢。
祝福, 鲍勃

对于这种系统,Prolog是您的好朋友。 - Enrique
3个回答

6
也许你需要一个Rete规则引擎。试试Drools。
或者是数据驱动的决策表。
如果你想要一个类的解决方案,考虑多态性。用像Strategy或Visitor这样的类替换所有if/then/else语句。
关键在于稳定的接口。如果你能保持接口的稳定,并改变底层实现,那么你就成功了。

我确实喜欢多态性,但它增加了垂直依赖性,因此如果我想更改基类的方法签名,则所有继承类都必须更改。 - Bob

0
使用一个N维数组,以此方式进行查找/查询/修改您的决策。

这是一个聪明的避免使用 switch 语句的方法,但从设计角度来看,我认为我们仍然在使用相同的 switch 语句,只是更加智能。而且我们必须将操作硬编码到索引中。你觉得呢... - Bob

0
如ziplin所建议的那样,如果每种组合都有一个决策(即不是“稀疏”的决策分布——我认为这是正确的术语),那么我会考虑使用3D数组。这将需要您能够在表达式中封装决策逻辑,并将其存储在数组中。对于稀疏的决策分布,可以类似地使用邻接表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接