我认为你应该使用GoF模式
责任链。您应该引入两个接口:1)
Condition
,您将在其中检查正确的条件,例如“如果zip文件不存在”,并返回布尔结果-如果满足条件,则为“true”,否则为“else”,2)
Execution strategy
,它将运行与条件分配的操作,例如“从指定URL下载它,然后解压缩它并读取文件并将zip文件移动到指定目录”。因此,第一个接口将回答“何时”,第二个接口将回答“然后”。 “Condition”实现和“execution strategy”实现应该组合成“元组”(或对,条目等)。这个“元组”应该按顺序移动到集合中,您已经描述了它。然后,当您需要处理zip文件时,您将遍历集合,调用条件并检查结果,如果结果为“true”,则调用适当的“execution strategy”。此外,条件可以与执行策略结合并移至单个接口/实现,具有两种方法。可以在条件/执行策略之间传递描述zip文件当前状态的上下文。
希望这有所帮助。
更新。
Java代码示例。
interface Condition {
boolean isSatisfied(String pathToFile);
}
...
interface Action {
void execute(String pathToFile);
}
...
class ZipFileExistsCondition implements Condition {
@Override
public boolean isSatisfied(String pathToFile) {
...
}
}
...
class ZipFileDoesNotExists implements Condition {
@Override
public boolean isSatisfied(String pathToFile) {
...
}
}
...
class AlwaysSatisfiedCondition implements Condition {
@Override
public boolean isSatisfied(String pathToFile) {
...
}
}
...
Collection<Map.Entry<Condition, Action>> steps = Arrays.asList(
new AbstractMap.ImmutableEntry<Condition, Action>(new ZipFileExistsCondition(),
new Action() { }),
new ZipFileDoesNotExists(), new Action() { },
new AlwaysSatisfiedCondition(), new Action() { }
);
...
String pathToFile = ...
...
for(Map.Entry<Condition, Action> step: steps) {
if(!step.getKey().isSatisfied(pathToFile))
continue;
step.getValue().execute(pathToFile);
}
备注:
1)您可以将“条件”实现为匿名类,
2)“AlwaysSatisfiedCondition”可以是单例模式,
3)如果您使用Java / Groovy / Scala,则可以使用Guava / Apache Commons的“Predicate”代替“Condition”,使用“Function”或“Closure”代替“Action”。
如果您需要在第一个“满足”的条件和适当的操作执行后退出,则只需在操作执行后放置“break”/“return”。