您可以将所有步骤抽象为一个步骤链。步骤链将是一个可重用的类,因此它不特定于一个类。在您的案例类A
中。
为步骤链按顺序执行的有序步骤创建接口。
public interface Step {
public void execute();
}
public interface Ordered {
public int getOrder();
public void setOrder(int order);
}
public interface OrderedStep extends Step, Ordered {
}
比较器帮助对实现有序的实例进行排序。
public class OrderedComparator implements Comparator<Ordered> {
public int compare(Ordered a, Ordered b) {
if (a.getOrder() > b.getOrder()) {
return 1;
}
if (a.getOrder() < b.getOrder()) {
return -1;
}
return 0;
}
}
步骤链将负责按指定顺序执行所有步骤。
public class OrderedStepChain {
List<OrderedStep> steps = new ArrayList<OrderedStep>();
public void addStep(OrderedStep step) {
steps.add(step);
}
public void execute() {
Collections.sort(steps, new OrderedComparator());
for (OrderedStep step : steps) {
step.execute();
}
}
}
一个简单的步骤实现。
public class OrderedStepImpl implements OrderedStep {
public int order;
public void setOrder(int order) {
this.order = order;
}
public int getOrder() {
return order;
}
public void execute() {
System.out.println("Step#" + order + " executed");
}
}
通过步骤链处理的所有步骤,它相当容易使用。将此功能添加到可能需要它的其他类中也更容易。
public class A {
OrderedStepChain stepChain = new OrderedStepChain();
// add steps backwards
public void createSteps() {
for (int i = 9; i > 0; i--) {
OrderedStep step = new OrderedStepImpl();
step.setOrder(i);
stepChain.addStep(step);
}
}
/*
* Other objects may interact with the step chain
* adding additional steps.
*/
public OrderedStepChain getStepChain() {
return this.stepChain;
}
public void completeFlow() {
stepChain.execute();
}
}
当我运行单元测试时,输出是。
Step#1 executed
Step#2 executed
Step#3 executed
Step#4 executed
Step#5 executed
Step#6 executed
Step#7 executed
Step#8 executed
Step#9 executed