2011-02-24 17 views
0

您好我想建立一個流暢的接口來創建一個對象某種工廠或生成器。如何在流式接口的方法調用中構建一個序列

我知道我必須「返回這個」才能使方法可鏈接。

public class CarBuilder 
{ 

    public CarBuilder() 
    { 
     car = new Car(); 
    } 
    private Car car; 

    public CarBuilder AddEngine(IEngineBuilder engine) 
    { 
     car.Engine = engine.Engine(); 
     return this; 
    } 

    public CarBuilder AddWheels(IWheelsBuilder wheels) 
    { 
     car.Wheels = wheels.Wheels(); 
     return this; 
    } 
    public CarBuilder AddFrame(IFrameBuilder frame) 
    { 
     car.Frame = frame.Frame(); 
     return this; 
    } 

    public Car BuildCar() 
    { 
     return car; 
    } 

} 

有了這個,我可以建立一個汽車這樣的:

Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(eBuilder).BuildCar(); 

但我需要的是一個特殊的順序或工作流程: 我只能建立在框架的頂部,當車輪車輪存在,那麼我就可以建立引擎。 因此,而不是提供汽車製造商的每一種方法,我希望能夠只添加框架的建設者,然後只有車輪的框架,然後發動機的頂部...

而如何它是還是什麼將是一個很好的實現,如果EngineBuilder本身所具有的流暢API像eBuilder.Cylinders(12).WithPistons()....

纔有可能有這樣的事情

Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(x=>x.WithCylinders(12).WithPistons()).BuildCar(); 

總而言之,如何構造流暢接口的流程以及如何嵌套流利接口?

回答

0

而不是有一個公開所有方法的單個CarBuilder類,您有多個類,每個類只公開適用於正在構建的汽車的「狀態」的方法。

舉個例子,CarBuilder只能提供AddFrame。而不是返回this的,AddFrame返回CarBuilderWithFrame類的一個對象,它僅提供AddWheels,它返回CarBuilderWithFrameAndWheels類的一個對象,它僅提供AddEngine,它返回只提供BuildCarBuilderWithEverything類的對象。

這個例子是非常連續的,你可以爭論在這樣一個線性過程中完成這麼多工作是否合理。

我喜歡的一個例子是打印。 Printer對象可以返回一個PrintJob對象,該對象提供三種方法:取消,打印或StartPage。 StartPage方法將返回一個Page對象,該對象爲您提供了所有繪圖命令的方法,即一個叫做EndPage的繪圖命令,它可讓您返回PrintJob對象。這使硬編碼簡單的打印作業變得容易。

Printer.StartPrintJob().StartPage().DrawText("Title").DrawIcon("logo.png").EndPage().Print(); 
0

如果AddWheels不能成爲Frame的一種方法呢?您也可以考慮在請求無效操作時拋出異常,例如添加沒有框架的輪子。

+0

我想創建一個流利的API一個像流利的nhibernate一樣的costum dsl ...更像鏈接方法 – silverfighter 2011-02-24 22:31:26

相關問題