这天你刚刚打卡上班,开启电脑,打开eclipse,登陆qq,进入qq群,正准备跟群友摸一天的鱼.突然你的老板跑到你身边给了你个任务:
1.1给前端一个接口,根据前端传入的orderid返回整个订单的详情,简单,你抬抬手就写完了代码,将订单表中的数据拿出来返回给前端了;
数据库信息:
前台数据:
{"id":1,"detail":"秃驴是个大帅哥","state":"1"}
1.2正当你要继续摸鱼的时候,前端跑过来说:"大哥,你能不能把订单状态(state)的返回值搞成中文啊?"
"好说",我们直接定义一个用于专门用于返回给前端的实体类,将数据转换后再丢给前端;
public class OrderInfo { private Integer id; private String state; public OrderInfo(Integer id,String state){ this.id=id; this.state=state; } ...}
前端数据:
{"id":1,"detail":"秃驴是个大帅哥","state":"交易状态"}
1.3需求怎么可能就改一次!这不,前端又让加个state_code参数好让他根据state(订单状态)的值做不同动作,这也不难;
返回实体类的属性:
private Integer id; private String state; private String state_code;
前端数据:
{"id":1,"state":"1","state_code":"交易状态"}
关键代码:
String stateCode = order.getState(); orderInfo.setState_code(stateCode); String state = null; switch (stateCode) { case "0": state = "创建状态"; break; case "1": state = "交易状态"; break; case "2": state = "完成状态"; break; } orderInfo.setState(state)
1.4该需求这种事怎么会只有前端改,所以项目经理提了他的要求:"给order表价加个state_pay(付款状态),也返给前端吧."
于是我们又改:
String stateCode = order.getState(); orderInfo.setState_code(stateCode); ... orderInfo.setState(state); String payStateCode = order.getStatePay(); orderInfo.setPay_state_code(payStateCode); String payState = null; switch (payStateCode) { case "0": payState = "待付款"; break; case "1": payState = "付款中"; break; case "2": payState = "已付款"; break; } orderInfo.setPay_state(payState);
前台数据:
{"id":1,"state":"交易状态","state_code":"1","pay_state":"付款中","pay_state_code":"1"}
2.1前端一看这不行啊,我本来判断一个值就好了,这下要一下子判断2个值,ifelse这不得搞好多个啊,就跟我们要求只要一个状态:
state=0 state_pay=0 => status :待交易 code: 0state=0 state_pay=1 => status :预交易 code: 1state=1 state_pay=2 => status :交易中 code: 2state=2 state_pay=2 => status :已交易 code: 3
好家伙,这么改来改去自己后台代码也得各种ifelse不说,每次修改,都得修改一大坨代码,以后维护自己看了都头大,有没有什么好方法让自己的代码更优雅易读呢?
Builder设计模式专门为这种场合使用!
现在我们以builder模式改造我们的返回实体类:
public class OrderInfo { private Integer id; private String status; private String code; public static class Builder { private OrderInfo order; private String state; private String payState; public Builder() { order = new OrderInfo(); } public Builder state(String state) { this.state = state; return this; } public Builder pay(String payState) { this.payState = payState; return this; } public OrderInfo build() { //在build()里进行构建order对象 switch (this.state) { case "2": order.setCode("3"); order.setStatus("已交♂易"); break; case "1": order.setCode("2"); order.setStatus("交♂易中"); break; case "0": switch (payState) { case "1": order.setCode("1"); order.setStatus("预交♂易"); break; case "0": order.setCode("0"); order.setStatus("待交♂易"); break; } break; } return order; } } //只允许builder创建新对象 private OrderInfo() { } public Integer getId() { return id; } public String getStatus() { return status; } public String getCode() { return code; } public void setId(Integer id) { this.id = id; } private void setStatus(String status) { this.status = status; } private void setCode(String code) { this.code = code; }}
@service层关键代码:
Order order = ... OrderInfo orderInfo = new OrderInfo.Builder() .state(order.getState()) .pay(order.getStatePay()) .build(); orderInfo.setId(order.getId()); return orderInfo;
这里Builder把原先需要在service层进行的逻辑判断移到了自身的builder方法中,如果以后又要更改状态或者逻辑的话service层可以不改动或者很小,只改动OrderInfo的内部类Builder就可以了,而且整个代码看起来也更清晰;感觉整个人都优雅了起来呢;
2.2所以当项目经理来告诉我们要再加个state_express(快递状态)的时候,
state=0 state_pay=0 state_express=0 => status :待交易 code: 0state=0 state_pay=1 state_express=0 => status :预交易 code: 1state=1 state_pay=2 state_express=0 => status :待发货 code: 2state=1 state_pay=2 state_express=1 => status :运送中 code: 3state=2 state_pay=2 state_express=2 => status :已完成 code: 4
我们不仅没打死项目经理,而且