連貫接口(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;}@Overridepublic 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、連貫接口可以應用在很多地方,在設計模式中,我所知道的一種就是應用於責任鏈模式。