2016-10-12 12 views
0

這是一個延續從我在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模式。

歡迎任何建議。

+0

這裏有問題嗎? – scottb

+0

啊,問題是,設計是否合理,以及是否有更好的方法來實現這一點,以及如果可以的話,不要在構建器模式中使用靜態內部類? – spakai

+0

對於所有意圖和目的而言,靜態成員類與頂級類相同(爲便於打包而移動)。所以,如果你想用一個實際的頂級課程作爲Builder,那就去做吧。許多人會說,因爲Builder只能與其構建對象的類一起工作,所以它最好打包爲該類的靜態成員類。但是你可以做任何你想做的事情。 – scottb

回答

3

你應該使用靜態內部類。使用這種方法的關鍵點是,內部可以直接訪問正在構建的對象的私有屬性。這有助於消除重複的代碼,因爲構建器不需要爲構建維護很長的臨時狀態列表。所以,你的代碼可以寫成這樣:

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對象,它不會不必要像以前一樣保持mandatoryflowBOutputoptionalflowAOutput

相關問題