2011-02-24 56 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

相关问题