此的一種方法將是
- 定義一個公共接口
opsX
方法和實現此方法的類。
- 定義一個
enum
來知道應該調用該公共接口的哪個類實現。
- 定義一個將作爲這些調用的協調器工作的類。
這種設計的實現可能是
interface CommonOps {
boolean ops();
}
class Ops1 implements CommonOps {
@Override
public boolean ops() {
//...
}
}
class Ops2 implements CommonOps {
@Override
public boolean ops() {
//...
}
}
//and on...
enum OpsOrder {
OPS1,
OPS2,
OPS3
//... and on
;
}
class Orchestrator {
public boolean executeOps(OpsOrder order) {
switch (order) {
case OPS1:
return new Ops1().ops();
case OPS2:
return new Ops2().ops();
//...
default:
throw new IllegalArgumentException("Not supported.");
}
throw new UnsupportedOperationException("This exception should never be reached.");
}
public boolean orchestrate(OpsOrder ... orders) {
for (OpsOrder order : orders) {
if (!executeOps(orders)) {
return false;
}
}
return true;
}
}
這可能是更通用的由具有工廠CommonOps
類實現這樣Orchestrator
不應該知道哪些CommonOps
將被稱爲:
final class CommonOpsFactory {
private CommonOpsFactory() { }
public static CommonOps create(OpsOrder order) {
switch (order) {
case OPS1:
return new Ops1();
case OPS2:
return new Ops2();
//...
default:
throw new IllegalArgumentException("Not supported.");
}
}
}
class Orchestrator {
public boolean executeOps(OpsOrder order) {
return CommonOpsFactory.create(order).ops();
}
public boolean orchestrate(OpsOrder ... orders) {
for (OpsOrder order : orders) {
if (!executeOps(orders)) {
return false;
}
}
return true;
}
}
如果不成功,它拋出異常? –
我可以看到這是一個責任鏈 –
@SotiriosDelimanolis是的。每個操作都可以拋出異常,客戶端會收到一個錯誤,指出執行失敗。 –