使用级联函数调用设计API(Class.doThis(“…”)。doThat(“…”)…)

我已经看到一些API的设计方式必须使用它们,如下面的代码

Class.doThis("...").doThat("...")..... 

例如,HTTPCommon(Fluent API)可用作:

 Request.Get("http://somehost/") .connectTimeout(1000) .socketTimeout(1000) .execute().returnContent().asString(); 

石英计划可用作:

 JobDetail job = newJob(HelloJob.class) .withIdentity("job1", "group1") .build(); 

SimpleCatptch可用作:

 Captcha captcha = new Captcha.Builder(200, 50) .addText() .addBackground() .addNoise() .gimp() .addBorder() 

这种API设计的名称是什么? 这样的设计好吗?

正如HTTPCommon所说,它简称为“流畅”。 构建器通常具有流畅的布局,但构建器模式是正交的:Fluent API是关于可读的链式方法调用,而构建器是关于为对象指定完整配置,然后一次性构建完整状态。

只要代码可读,这种风格就适用; 当IDE自动完成可以帮助程序员时,它特别有用。 两个最常见的用例是配置(构建器或Spring样式的配置器)和数据管道(例如Java 8流和反应式编程)。

您的第一个示例可以称为方法链接。
其他示例具有构建器模式,方法链接和流畅的接口。

对于问题的第二部分,请参阅流畅的界面和Builder模式之间的区别是什么? 和相关的问题。

这只是一个建设者模式。 来自oodesign :

动机

应用程序越复杂,所使用的类和对象的复杂性就越大。 复杂对象由其他对象生成的部件组成,在构建时需要特别小心。 应用程序可能需要一种机制来构建独立于构成对象的复杂对象。 如果这是您遇到的问题,您可能想尝试使用Builder(或Adaptive Builder)设计模式。

此模式允许客户端对象通过仅指定其类型和内容来构造复杂对象,并屏蔽与对象表示相关的详细信息。 这样,构造过程可用于创建不同的表示。 此过程的逻辑与创建复杂对象时使用的实际步骤是隔离的,因此可以再次使用该过程从与第一个简单对象相同的一组简单对象创建不同的对象。

基本上,如果对象的构建过程有些复杂并且想要公开构造它的声明方式,则可以使用它。