これは、Passing1で作業していたものから同じオブジェクトタイプの多くのパラメーターへの続きです。
私はそれについて良いフィードバックを得ました、私は私がデザインを改善したと信じています。コード全体は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();
}
ここで、FlowA-> FlowB-> FlowCの順序で実行される3つのフローがあるとします。
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;
}
}
私が書いた1つのテストは、使用例を示しています
FlowBOutput mandatoryflowBOutput = new FlowBOutput();
mandatoryflowBOutput.setOutput1FromB("iNeedThis");
FlowAOutput optionalflowAOutput = new FlowAOutput();
FlowCInput input = new FlowCInputBuilder(mandatoryflowBOutput)
.setOptionalflowAOutput(optionalflowAOutput)
.build();
Builderパターンに静的内部クラスを使用していません。
どんな提案も歓迎します。
静的内部クラスを使用する必要があります。このアプローチを使用することの重要なポイントは、内部が構築されているオブジェクトのプライベートプロパティに直接アクセスできることです。ビルダーは構築のために一時的な状態の長いリストを維持する必要がないため、これは重複したコードを排除するのに役立ちます。したがって、コードは次のように書き直すことができます。
public class FlowCInput {
private int output1FromB; // suppose that it is int
private String output2FromA; // suppose that it is String
private FlowCInput() { }
//...
public static class FlowCInputBuilder implements Builder<FlowCInput> {
private final FlowCInput result;
public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) {
result = new FlowCInput();
// output1FromB is private but still accessed from here
result.output1FromB = mandatoryflowBOutput.getOutput1FromB();
}
public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) {
// same for output2FromA
result.output2FromA = optionalflowAOutput.getOutput2FromA();
return this;
}
@Override
public FlowCInput build() {
return result;
}
}
}
ご覧のとおり、ビルダーはFlowCInput
オブジェクトのみを保持するようにmandatoryflowBOutput
なりoptionalflowAOutput
、以前のように不必要に保持することはありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加