在 Java 工作流中使用哪种设计模式
Which design pattern to use on Java workflow
我想实现用于执行工作流的代码,但我想避免 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..
if
语句正是这样做的。精心制作的 if, else if, else
将以最简单的形式描述逻辑。
如果您需要在运行时指定逻辑,例如通过 DSL,那么您可能想要创建决策和命令对象的树结构,其中一个决策可以链接到多个潜在的命令,以及一个命令可以链接到单个后续命令。然后树将通过一个执行器传递,该执行器将从树的根部开始并根据决策的输入执行决策和命令。
不确定您要做什么,但看起来需要在处理过程中的某个时间做出决定。如果您不想使用 if..else 阶梯,您可以使用以下方法创建抽象 class:
abstract protected boolean condition(<whatever params you need>)
abstract protected boolean doAction(<same params>)
public void execute(<params>) {
if(condition(<params>)) {
doAction(<params>)
}
}
您可以扩展这个抽象基础 class 并为每个行为创建一个规则 class 来管理满足条件时发生的条件和操作。
然后您可以将这些 class 链接在一起并从某个地方的循环中执行它们(将初始输入 (A) 传递给列表中的第一个规则)您还可以添加另一个抽象方法并调用它来自 execute() 中 IF 之后的 ELSE 块
基本上,所有这些方法所做的就是将您的 If..Else 阶梯抽象到更高的层次。根据问题的范围,执行 ifs 和 else 实际上可能更简单。
如果你给我更多的细节,我可以提供更多的想法!
这里要考虑的明显选择是 Chain of Responsibility。在这种情况下,CoR 的问题是有时您并不真正提前知道路径是什么,因此布置所有可能的路径可能真的很费力。当然,您可以使用 Builder 来构建链条(请记住四人组中所有的迷宫构建示例)。
CoR 的伟大之处在于,您的代码不会成为一个大神对象,每个对象都有无能为力的棋子 'step.'
此外,CoR 提供了很大的灵活性。如果客户过来并说 'OMG, there are two crucial steps missing,' ,那么有人可能会添加它们而不会破坏很多其他东西的稳定性。单源编排是典型的上帝对象反模式,因此可以从 CoR 开始,并计划在它用完绳子时撤离。
这也可以用Messaging Patterns or Pipes & Filter来想象。
如果您只是想要一个可配置的工作流程,可以使用 channels and routers 个组件来完成。
根据问题的性质和严重程度,您可以创建自己的上述组件的迷你简单实现,或者寻找现成的解决方案,例如 Spring 集成(可能需要一些学习曲线来照顾的).
我想实现用于执行工作流的代码,但我想避免 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..
if
语句正是这样做的。精心制作的 if, else if, else
将以最简单的形式描述逻辑。
如果您需要在运行时指定逻辑,例如通过 DSL,那么您可能想要创建决策和命令对象的树结构,其中一个决策可以链接到多个潜在的命令,以及一个命令可以链接到单个后续命令。然后树将通过一个执行器传递,该执行器将从树的根部开始并根据决策的输入执行决策和命令。
不确定您要做什么,但看起来需要在处理过程中的某个时间做出决定。如果您不想使用 if..else 阶梯,您可以使用以下方法创建抽象 class:
abstract protected boolean condition(<whatever params you need>)
abstract protected boolean doAction(<same params>)
public void execute(<params>) {
if(condition(<params>)) {
doAction(<params>)
}
}
您可以扩展这个抽象基础 class 并为每个行为创建一个规则 class 来管理满足条件时发生的条件和操作。
然后您可以将这些 class 链接在一起并从某个地方的循环中执行它们(将初始输入 (A) 传递给列表中的第一个规则)您还可以添加另一个抽象方法并调用它来自 execute() 中 IF 之后的 ELSE 块
基本上,所有这些方法所做的就是将您的 If..Else 阶梯抽象到更高的层次。根据问题的范围,执行 ifs 和 else 实际上可能更简单。
如果你给我更多的细节,我可以提供更多的想法!
这里要考虑的明显选择是 Chain of Responsibility。在这种情况下,CoR 的问题是有时您并不真正提前知道路径是什么,因此布置所有可能的路径可能真的很费力。当然,您可以使用 Builder 来构建链条(请记住四人组中所有的迷宫构建示例)。
CoR 的伟大之处在于,您的代码不会成为一个大神对象,每个对象都有无能为力的棋子 'step.'
此外,CoR 提供了很大的灵活性。如果客户过来并说 'OMG, there are two crucial steps missing,' ,那么有人可能会添加它们而不会破坏很多其他东西的稳定性。单源编排是典型的上帝对象反模式,因此可以从 CoR 开始,并计划在它用完绳子时撤离。
这也可以用Messaging Patterns or Pipes & Filter来想象。
如果您只是想要一个可配置的工作流程,可以使用 channels and routers 个组件来完成。
根据问题的性质和严重程度,您可以创建自己的上述组件的迷你简单实现,或者寻找现成的解决方案,例如 Spring 集成(可能需要一些学习曲线来照顾的).