首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在fluent接口的方法调用中构建序列

如何在fluent接口的方法调用中构建序列
EN

Stack Overflow用户
提问于 2011-02-24 23:20:26
回答 2查看 478关注 0票数 0

嗨,我想建立一个流畅的接口来创建我的对象,某种工厂或建设者。

我知道我必须"return this“才能使这些方法可链接。

代码语言:javascript
复制
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;
    }

}

有了这个,我就可以造一辆这样的车:

代码语言:javascript
复制
 Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(eBuilder).BuildCar();

但我需要的是一个特殊的顺序或工作流程:我只能在车架的顶部建立轮子,当轮子存在时,我就能够建立引擎。因此,不是提供汽车制造商的所有方法,我希望能够仅向制造商添加车架,然后仅将车轮添加到车架,然后将发动机添加到车架顶部…

如果EngineBuilder本身有一个像eBuilder.Cylinders(12).WithPistons()这样的流畅的api,那么它是如何实现的,或者说什么是一个好的实现。

有没有可能有这样的东西

代码语言:javascript
复制
Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(x=>x.WithCylinders(12).WithPistons()).BuildCar();

那么,总而言之,如何构造fluent接口的流,以及如何嵌套fluent接口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-16 02:48:30

不是只有一个CarBuilder类公开所有方法,而是有多个类,每个类只公开适合于正在建造的汽车的“状态”的方法。

根据您的示例,CarBuilder将只提供AddFrameAddFrame不返回this,而是返回一个只提供AddWheelsCarBuilderWithFrame类对象,它返回一个只提供AddEngineCarBuilderWithFrameAndWheels类对象,它返回一个只提供BuildCarBuilderWithEverything类对象。

这个示例非常连续,您可以争论为这样一个线性过程经历这么多工作是否有意义。

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

代码语言:javascript
复制
Printer.StartPrintJob().StartPage().DrawText("Title").DrawIcon("logo.png").EndPage().Print();
票数 0
EN

Stack Overflow用户

发布于 2011-02-24 23:22:55

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5106611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档