Fluent interface 简介

来源:互联网 发布:淘宝一件代发如何发货 编辑:程序博客网 时间:2024/05/22 08:03
在软件工程中,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();

    

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

   

原创粉丝点击