连贯接口(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、连贯接口可以应用在很多地方,在设计模式中,我所知道的一种就是应用于责任链模式。