這是一個延續從我在Passing 1 to many parameters of same object type使用流利的生成器模式無需內部靜態類的工作流程
工作,我已經得到了上良好的反饋,我相信我有完善的設計。整個代碼是在https://github.com/spakai/flow_input_builder
的要求是簡單的: -
我需要建立使用1個或多個輸出從先前的工作流程
我有一組接口
一組不同的工作流程的輸入的public interface SwfInput {
}
public interface SwfOutput {
}
public interface Workflow<I extends SwfInput, O extends SwfOutput> {
public O execute(I input);
}
public interface Builder<I extends SwfInput> {
public I build();
}
現在,說我有它獲取順序執行3個流動FlowA-> FlowB-> FlowC
FlowC需要米從FlowB必備型輸出,但只任選地從FlowA
所以我有FlowCBuilder
一個實施public class FlowCInputBuilder implements Builder<FlowCInput> {
private final FlowBOutput mandatoryflowBOutput;
private FlowAOutput optionalflowAOutput;
public FlowAOutput getOptionalflowAOutput() {
return optionalflowAOutput;
}
public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) {
this.optionalflowAOutput = optionalflowAOutput;
return this;
}
public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) {
this.mandatoryflowBOutput = mandatoryflowBOutput;
}
@Override
public FlowCInput build() {
FlowCInput input = new FlowCInput();
input.setMandatoryFromFlowB(mandatoryflowBOutput.getOutput1FromB());
if (optionalflowAOutput != null) {
input.setOptionalFromFlowA(optionalflowAOutput.getOutput2FromA());
}
return input;
}
}
一個測試我寫示出了一個示例性的使用我還沒有使用
FlowBOutput mandatoryflowBOutput = new FlowBOutput();
mandatoryflowBOutput.setOutput1FromB("iNeedThis");
FlowAOutput optionalflowAOutput = new FlowAOutput();
FlowCInput input = new FlowCInputBuilder(mandatoryflowBOutput)
.setOptionalflowAOutput(optionalflowAOutput)
.build();
靜態內部類爲Builder模式。
歡迎任何建議。
這裏有問題嗎? – scottb
啊,問題是,設計是否合理,以及是否有更好的方法來實現這一點,以及如果可以的話,不要在構建器模式中使用靜態內部類? – spakai
對於所有意圖和目的而言,靜態成員類與頂級類相同(爲便於打包而移動)。所以,如果你想用一個實際的頂級課程作爲Builder,那就去做吧。許多人會說,因爲Builder只能與其構建對象的類一起工作,所以它最好打包爲該類的靜態成員類。但是你可以做任何你想做的事情。 – scottb