Fluent interface 简介

在软件工程中,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 table
client.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 class
var 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 it
new Kitten()
  .setName('Bob')
  .setColor('black')
  .setGender('male')
  .save();

    

Java

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))));

   

你可能感兴趣的:(JEE)