连贯接口(fluent interface),有时候也会叫做方法链(链式调用),可以起到简化编码的作用,同时保持对象间的贯通一致。

所谓的连贯接口/方法链,在平时编程中,也比较常见,下面举几个小例子:

hibernate 里方法链的编程风格:

List results = session.createQuery("from users u order by u.age asc")
.setFirstResult(10)
.setMaxResutls(10)
.list();

java 里 json 的操作:

JsonGenerator jsonGen = Json.createGenerator(swriter);
jsonGen.writeStartObject()
.write("type", "chat")
.write("from", chatMessage.getFrom())
.write("fromName", chatMessage.getFromName())
.write("to", chatMessage.getTo())
.write("targetName", chatMessage.getTargetName())
.write("message", chatMessage.getMessage())
.writeEnd();
jsonGen.close();

dom4j 里的链式操作:

Element chatMessage = chatMessages.addElement("chatMessage")
.addAttribute("fromUserId","1")
.addAttribute("fromName", "tianya")
.addAttribute("toUserId", "haijiao");

jquery 的链式调用:

//注意这样做,只是为了演示,可根据实际情况来调整
$(‘#id’).show().hide().show().hide().show().hide();

例子还有很多,大家可以多点积累,下面讲一下连贯接口的设计要点:

1)相关方法或属性方法的设计中,只有输入参数或者无参数。

2)每个连贯方法的返回值都是一个类型实例,但不要求返回自身。

一个小小的示例:

public class User {
private String name;
private String password;
private int age;
 
public String getName() {
return name;
}
public User setName(String name) {
this.name = name;
return this;
}
public String getPassword() {
return password;
}
public User setPassword(String password) {
this.password = password;
return this;
}
public int getAge() {
return age;
}
public User setAge(int age) {
this.age = age;
return this;
}
 
@Override
public String toString() {
return "[name:"+name+" password:"+password+" age:"+age+"]";
}
 
public static void main(String[] args) {
User user = new User();
user.setName("tianya").setPassword("123456").setAge(22);
System.out.println(user);    //输出:[name:tianya password:123456 age:22]
}
}

附:

1、连贯接口的使用,一般来说在设置基本类型数据时,都是没有问题的.可对于设置对象,处理不好,可能会出现空指针错误,在 hibernate 的 javabean 里使用连贯接口,就有可能出现这种问题了(设置了一个引用对象).

2、连贯接口可以应用在很多地方,在设计模式中,我所知道的一种就是应用于责任链模式。