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 本身有一个像 eBuilder.Cylinders(12).WithPistons() 一样的流利的 api,它会是什么或者什么是一个好的实现......

有没有可能有这样的东西

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

那么总而言之,如何构造 fluent interface 的流程以及如何嵌套 fluent Interfaces 呢?

4

2 回答 2

0

那么 AddWheels 不会是属于 Frame 的方法吗?您还可以考虑在请求无效操作时抛出异常,例如添加没有框架的轮子。

于 2011-02-24T15:22:55.100 回答
0

与公开所有方法的单个 CarBuilder 类不同,您有多个类,每个类仅公开适合正在建造的汽车“状态”的方法。

鉴于您的示例,CarBuilder将仅提供AddFrame. 不是返回this,而是返回仅提供AddFrame的类的对象,返回仅提供的类的对象,返回仅提供的类的对象。CarBuilderWithFrameAddWheelsCarBuilderWithFrameAndWheelsAddEngineCarBuilderWithEverythingBuild

这个例子是非常连续的,你可以争论为这样一个线性过程完成这么多工作是否有意义。

我喜欢的一个例子是打印。Printer 对象可以返回提供三种方法的 PrintJob 对象:Cancel、Print 或 StartPage。StartPage 方法将返回一个 Page 对象,该对象为您提供所有绘图命令的方法,一个称为 EndPage 的方法将返回 PrintJob 对象。这使得对简单的打印作业进行硬编码变得容易。

Printer.StartPrintJob().StartPage().DrawText("Title").DrawIcon("logo.png").EndPage().Print();
于 2017-11-15T18:48:30.477 回答