博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单易懂的Builder模式
阅读量:6881 次
发布时间:2019-06-27

本文共 3895 字,大约阅读时间需要 12 分钟。

hot3.png

这天你刚刚打卡上班,开启电脑,打开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

我们不仅没打死项目经理,而且

转载于:https://my.oschina.net/imsorry/blog/3016430

你可能感兴趣的文章
idea live tempate
查看>>
Vue2.5从0开发猫眼
查看>>
浅析Cocoapods机制
查看>>
Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
查看>>
开源大数据周刊-第68期
查看>>
区块链100讲:如果连电子钱包都不懂,还谈什么区块链开发(有彩蛋)
查看>>
Java NIO(八) FileChannel
查看>>
打破铁三角:新的项目管理角度
查看>>
Java虚拟机07——类加载器与双亲委派模型
查看>>
iOS实现类似苹果手机原生的锁屏界面(数字密码)
查看>>
express框架链接池的使用
查看>>
基于Transform实现更高效的组件化路由框架
查看>>
24 个实例入门并掌握「Webpack4」(三)
查看>>
linux网卡配置
查看>>
Github Page 搜索工具更新 -- 索引数量扩容
查看>>
一个有趣的Js逗号表达式
查看>>
node服务适配前端路由
查看>>
[vue] 表单输入格式化,中文输入法异常
查看>>
three.js 专题
查看>>
Observer观察者模式与OCP开放-封闭原则
查看>>