在软件工程中,Fluent Interface(由埃里克·埃文斯和马丁·福勒(Martin Fowler)首创)是构建面向对象的API的一种方法,其中源代码的可读性接近普通书面散文。
流畅的接口通常通过使用方法级联(具体地方法链接)来中继后续调用的指令上下文来实现(但是流畅的接口不仅仅需要方法链接[1])。 一般来说,上下文是
“Fluent Interface”这个术语是在2005年底创造出来的,尽管这种整体界面风格可以追溯到20世纪70年代的Smalltalk的方法级联发明,也是20世纪80年代的很多例子。 一个常见的例子是C ++中的iostream库,它使用<<或>>操作符来传递消息,将多个数据发送到同一对象,并允许“操纵器”用于其他方法调用。 其他早期的例子包括Garnet系统(从1988年在Lisp)和Amulet系统(从1994年在C ++),它使用这种风格进行对象创建和属性分配。
JavaScript 例子:
有很多JavaScript库的例子使用了一些这样的变体:jQuery可能是最知名的。 通常,流利的构建器用于实现“数据库查询”,例如在https://github.com/Medium/dynamite中:
// getting an item from a tableclient.getItem('user-table') .setHashKey('userId', 'userA') .setRangeKey('column', '@') .execute() .then(function(data) { // data.result: the resulting object }) 在JavaScript中这样做的一个简单方法是使用原型继承和“this”:
// example from http://schier.co/post/method-chaining-in-javascript// define the classvar Kitten = function() { this.name = 'Garfield'; this.color = 'brown'; this.gender = 'male';}; Kitten.prototype.setName = function(name) { this.name = name; return this;}; Kitten.prototype.setColor = function(color) { this.color = color; return this;}; Kitten.prototype.setGender = function(gender) { this.gender = gender; return this;}; Kitten.prototype.save = function() { console.log( 'saving ' + this.name + ', the ' + this.color + ' ' + this.gender + ' kitten...' ); // save to database here... return this;}; // use itnew Kitten() .setName('Bob') .setColor('black') .setGender('male') .save();
The jOOQ 项目把 SQL 的调用, 做成Fluent API的风格:
Author author = AUTHOR.as("author");create.selectFrom(author) .where(exists(selectOne() .from(BOOK) .where(BOOK.STATUS.eq(BOOK_STATUS.SOLD_OUT)) .and(BOOK.AUTHOR_ID.eq(author.ID))));
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删