嗨,我想建立一个流畅的接口来创建我的对象,某种工厂或建设者。
我知道我必须"return this“才能使这些方法可链接。
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接口的流,以及如何嵌套fluent接口?
发布于 2017-11-16 02:48:30
不是只有一个CarBuilder类公开所有方法,而是有多个类,每个类只公开适合于正在建造的汽车的“状态”的方法。
根据您的示例,CarBuilder将只提供AddFrame。AddFrame不返回this,而是返回一个只提供AddWheels的CarBuilderWithFrame类对象,它返回一个只提供AddEngine的CarBuilderWithFrameAndWheels类对象,它返回一个只提供Build的CarBuilderWithEverything类对象。
这个示例非常连续,您可以争论为这样一个线性过程经历这么多工作是否有意义。
我喜欢的一个例子是打印。打印机对象可以返回一个提供三种方法的PrintJob对象: Cancel、Print或StartPage。StartPage方法将返回一个Page对象,该对象为您提供所有绘图命令的方法,其中一个名为EndPage的对象将返回PrintJob对象。这使得对简单的打印作业进行硬编码变得很容易。
Printer.StartPrintJob().StartPage().DrawText("Title").DrawIcon("logo.png").EndPage().Print();发布于 2011-02-24 23:22:55
那么,AddWheels不是一个绑定到框架的方法吗?您还可以考虑在请求无效操作时抛出异常,例如添加没有框架的轮子。
https://stackoverflow.com/questions/5106611
复制相似问题