流畅接口就是用起来很流畅了:-) , 到底长什么样子呢? 咱们看看Martin Flower 举的例子:
订单包括订单项(line item) , 由产品和产品的数量组成, 一个订单项是可以忽略的(skippable) , 意思是说我宁愿不要这个产品, 也想整个订单的其他产品能及时发送。 另外,我能给整个订单一个紧急的状态。
对这种事情最常见的构建方式像下面这样:
private void makeNormalOrder(Customer customer) {
Order o1 = new Order();
customer.addOrder(o1);
OrderLine line1 = new OrderLine(6, Product.find("TAL"));
o1.addLine(line1);
OrderLine line2 = new OrderLine(5, Product.find("HPK"));
o1.addLine(line2);
OrderLine line3 = new OrderLine(3, Product.find("LGV"));
o1.addLine(line3);
line2.setSkippable(true);
o1.setRush(true);
}
本质上我们创建了各种各样的对象,然后把他们绑到了一起。
如果我们不能在Order 的构造函数中创建一起的话, 我们必须用各种临时的变量来帮助完成Order 对象的装配工作,例如 line 1, line2, line3, 然后把他们都加到order 当中。
用一个流畅接口来完成对象的装配是什么样子的呢?
private void makeFluentOrder(Customer customer) {
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
}
是不是看起来又清爽又易懂。
实现起来不不太难 , 关键点是return this .
public class Order{
boolean rush = false;
public Order with(int qty,String productName){
OrderLine line = new OrderLine(qty, Product.find(productName));
this.addLineItem(line);
return this ;
}
public Order priorityRush(){
this.rush = true; return this ;
}
}
但是还有个小问题,skippable() 该如何实现? 这个问题就留个你了 :-)
-----------------------------------------------------------------------------------
码农翻身公共号(coderising) : 由工作15年的IBM架构师创建,分享编程和职场的经验教训。
回复下面的关键字,查看更多文章
牛人 键盘侠 留学 读书 调试 烂代码 小白 培训
数据结构 代码腐化 无聊 迷茫 刚工作 死锁 简历 真实项目
HTTP Session XML AJAX TOMCAT 反射
加入码农翻身QQ群:135769418 每周日晚9点至10点定期授课,不容错过。
长按二维码, 关注"coderising"