我想实现执行工作流的代码,但我想避免使用if-else语句链。 我应该使用哪种设计模式?我看了一些,但找不到合适的
工作流程示例。
A-> if(B) do C,
if(!B) do D-> E -> if(F) do G,
if(!H) do I-> J-> K
and so on..
答案 0 :(得分:2)
if
语句就是这样做的。精心设计的if, else if, else
将以最简单的形式描述逻辑。
如果您需要在运行时指定逻辑,例如通过DSL,那么您可能想要创建Decision和Command对象的树结构,其中Decision可以链接到多个潜在的命令,并且Command可以是链接到单个后续命令。然后树将通过Executor传递,该Executor将从树的根开始,并根据决策的输入执行Decisions和Commands。
答案 1 :(得分:2)
这里也要考虑的显而易见的选择是Chain of Responsibility。在这种情况下CoR的问题有时候你并不真正知道这些路径会提前做什么,因此布置所有可能的路径可能非常费力。当然,您可以使用Builder来构建链(记住Gang of Four中的所有Maze构建示例)。
关于CoR的好处是,你的代码不会成为一个无用的小兵做每一步的大神对象。
此外,CoR提供了很大的灵活性。如果客户来并且说'OMG,那么有两个关键步骤缺失,'有人可以添加它们而不会破坏其他许多东西。单源编排是典型的上帝对象反模式,因此可能从CoR开始并计划在绳索用尽时撤离。
答案 2 :(得分:0)
不完全确定你要做什么,但看起来在处理期间需要在某些pt做出决定。如果您不想使用if..else梯形图,则可以使用以下方法创建抽象类:
abstract protected boolean condition(<whatever params you need>)
abstract protected boolean doAction(<same params>)
public void execute(<params>) {
if(condition(<params>)) {
doAction(<params>)
}
}
您可以扩展此抽象基类,并为每个行为创建规则类,以管理满足条件时发生的条件和操作。
然后,您可以将这些类链接在一起,从某个循环执行它们(将初始输入(A)传递给列表中的第一个规则)您还可以添加另一个抽象方法,并在IF之后从ELSE块调用它在execute()
中基本上,所有这些方法都是将你的If..Else阶梯抽象到更高的层次。根据您的问题的范围,事实上可能更容易做ifs和else。
如果你给我更多细节,我可以提供更多想法!
答案 3 :(得分:0)
使用Messaging Patterns或Pipes & Filter也可以设想这一点。
如果您只是想要一个可配置的工作流程,可以使用channels和routers组件来完成。
根据您的问题的性质和程度,您可以创建自己的上述组件的迷你简单实现,或者寻找可以使用的解决方案,例如Spring Integration(可能需要一些学习曲线)。