すべてのステップをステップ チェーンに抽象化できます。ステップ チェーンは再利用可能なクラスになるため、1 つのクラスに固有ではありません。あなたの場合、 class 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