简单易懂的Builder模式

简单易懂的Builder模式

这天你刚刚打卡上班,开启电脑,打开eclipse,登陆qq,进入qq群,正准备跟群友摸一天的鱼.突然你的老板跑到你身边给了你个任务:

1.1给前端一个接口,根据前端传入的orderid返回整个订单的详情,简单,你抬抬手就写完了代码,将订单表中的数据拿出来返回给前端了;

数据库信息:简单易懂的Builder模式

前台数据:

{"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: 0
state=0 state_pay=1 => status :预交易 code: 1
state=1 state_pay=2 => status :交易中 code: 2
state=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: 0
state=0 state_pay=1  state_express=0 => status :预交易 code: 1
state=1 state_pay=2  state_express=0 => status :待发货 code: 2
state=1 state_pay=2  state_express=1 => status :运送中 code: 3
state=2 state_pay=2  state_express=2 => status :已完成 code: 4

我们不仅没打死项目经理,而且简单易懂的Builder模式

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101073.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html使用toast弹窗,jQuery常用工具之message和toast弹窗插件「建议收藏」

    html使用toast弹窗,jQuery常用工具之message和toast弹窗插件「建议收藏」常用工具message和toast弹窗图片预览常用工具message和toast弹窗浏览器适配支持Chrome所有版本支持Firefox所有版本支持Safari所有版本不支持IE任何版本常用工具message和toast弹窗使用教程默认调用:alert(‘请打开麦克风’)支持多参数:alert({title:’我是标题’,content:’请打开https://huajiakeji.com/’…

    2022年9月25日
    2
  • 【知识图谱】知识推理[通俗易懂]

    【知识图谱】知识推理[通俗易懂]文章目录一、本体知识推理简介1、OWL本体语言(1)OWL本体语言概述(2)描述逻辑一、本体知识推理简介1、OWL本体语言(1)OWL本体语言概述OWL的特性:OWL本体语言是知识图谱中最规范(W3C制定)、最严谨(采用描述逻辑)、表达能力最强(是一阶谓词逻辑的子集)的语言;它基于RDF语法,使表示出来的文档具有语义理解的结构基础。促进了统一词汇表的使用,定义了丰富的语义词汇。允…

    2022年6月11日
    28
  • oracle创建数据库实例

    oracle创建数据库实例首先要确定自己电脑上安装了oracle客户端,电脑是window操作系统。打开DBCA,注意DBCA在Oracle这个文件夹里面:点击后进入创建数据库的界面选择创建数据库,这个界面还能删除已有的数据库【不展示】。点击下一步点击下一步检查一下配置信息,没有问题就点完成加载界面有点慢,需要等几分钟。这样就创建完成了。…

    2022年7月13日
    17
  • 前端基础(HTML,CSS,JavaScript)知识笔记,附:前端基础面试题!!

    前端基础(HTML,CSS,JavaScript)知识笔记,附:前端基础面试题!!前言HTML,CSS,JavaScript是前端入门必须学习的知识,也是最基础的知识。文章主要分享包括(HTML,CSS,JS)前端基础知识笔记,学习路线图,最后附前端基础面试题。HTML知识点1.html基本结构html标签是由<>包围的关键词。html标签通常成对出现,分为标签开头和标签结尾。有部分标签是没有结束标签的,为单标签,单标签必须使用/结尾。页面所有的内容,都在html标签中。html标签分为三部分:标签名称,标签内容,标签属性。html

    2022年6月15日
    28
  • C++学习之路——名字空间与模板

    C++学习之路——名字空间与模板例题:把课程当中的函数模板与类模板两个程序自己写一遍并写好注释。代码如下:#include “pch.h”#include<vector>#include<string>#include <iostream>using namespace std;//模板类template<class T> class Stack{publ…

    2022年8月18日
    4
  • 数据归一化小结

    数据归一化小结在各种模型训练,特征选择相关的算法中,大量涉及到数据归一化的问题。比如最常见的情况是计算距离,如果不同维度之间的取值范围不一样,比如feature1的取值范围是[100,200],feature2的取值范围是[1,2],如果数据不做归一化处理,会造成feature1在距离计算中占压倒性的优势,feature2完全体现不出来作用。而数据做归一化处理以后,会让各个不同特征对距离计算的贡献大致相同,从而避

    2022年6月23日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号