士大夫v产生的

一、前言

乱码七糟 [luàn qī bā zāo],我时常怀疑这个成语是来形容程序猿的! 无论承接什么样的需求,是不是身边总有那么几个人代码写的烂,但是却时常有测试小姐姐过来聊天(_求改bug_)、有产品小伙伴送吃的(_求写需求_)、有业务小妹妹陪着改代码(_求上线_),直至领导都认为他的工作很重要,而在旁边的你只能蹭点吃的。 那你说,CRUD的代码还想让我怎么样? 这样的小伙伴,可能把代码写的很直接,ifelse多用一点,满足于先临时支持一下,想着这也没什么的。而且这样的业务需求要的急又都是增删改查的内容,实在不想做设计。而如果有人提到说好好设计下,可能也会被反对不要过度设计。 贴膏药似的修修补补,一次比一次恐怖! 第一次完成产品需求实在是很快,但互联网的代码不比传统企业。在传统行业可能一套代码能用十年,但在互联网高速的迭代下你的工程,一年就要变动几十次。如果从一开始就想着只要完成功能就可以,那么随之而来的是后续的需求难以承接,每次看着成片成片的代码,实在不知如何下手。 在研发流程规范下执行,才能写出好程序! 一个项目的上线往往要经历业务需求、产品设计、研发实现、测试验证、上线部署到正式开量,而这其中对研发非常重要的一环就是研发实现的过程,又可以包括为;架构选型、功能设计、设计评审、代码实现、代码评审、单测覆盖率检查、编写文档、提交测试。所以在一些流程规范下,其实很难让你随意开发代码。 开发代码的过程不是炫技,就像盖房子如果不按照图纸来修建,回首就在山墙上搭一个厨房卫浴!可能在现实场景中这很荒唐,但在功能开发中却总有这样的代码。 **所以我们也需要一些设计模式的标准思想,去建设代码结构,提升全局把控能力。**

[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#%E4%BA%8C%E3%80%81%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83)二、开发环境

  1. JDK 1.8
  2. Idea + Maven
  3. 涉及工程三个,可以通过关注**公众号**:[bugstack虫洞栈(opens new window)](https://bugstack.cn/assets/images/qrcode.png),回复源码下载获取(打开获取的链接,找到序号18)
    工程描述
    itstack-demo-design-3-00场景模拟工程,模拟装修过程中的套餐选择(豪华、田园、简约)
    itstack-demo-design-3-01使用一坨代码实现业务需求,也是对ifelse的使用
    itstack-demo-design-3-02通过设计模式优化改造代码,产生对比性从而学习

[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#%E4%B8%89%E3%80%81%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E4%BB%8B%E7%BB%8D)三、建造者模式介绍

![](https://img-blog.csdnimg.cn/b277c7a6ba034c84a2ed1a656f5c3114.png)

  • 图片来自:[https://refactoringguru.cn/design-patterns/builder(opens new window)](https://refactoringguru.cn/design-patterns/builder)

**建造者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。** 那么,哪里有这样的场景呢? 例如你玩王者荣耀的时的初始化界面;有三条路、有树木、有野怪、有守卫塔等等,甚至依赖于你的网络情况会控制清晰度。而当你换一个场景进行其他不同模式的选择时,同样会建设道路、树木、野怪等等,但是他们的摆放和大小都有不同。这里就可以用到建造者模式来初始化游戏元素。 而这样的根据相同的物料,不同的组装所产生出的具体的内容,就是建造者模式的最终意图,也就是;**将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。**

[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#%E5%9B%9B%E3%80%81%E6%A1%88%E4%BE%8B%E5%9C%BA%E6%99%AF%E6%A8%A1%E6%8B%9F)四、案例场景模拟

![](https://img-blog.csdnimg.cn/8ff2c7f4e02945768a73b526dfd9a03b.png) **这里我们模拟装修公司对于设计出一些套餐装修服务的场景。** 很多装修公司都会给出自家的套餐服务,一般有;欧式豪华、轻奢田园、现代简约等等,而这些套餐的后面是不同的商品的组合。例如;一级&二级吊顶、多乐士涂料、圣象地板、马可波罗地砖等等,按照不同的套餐的价格选取不同的品牌组合,最终再按照装修面积给出一个整体的报价。 这里我们就模拟装修公司想推出一些套餐装修服务,按照不同的价格设定品牌选择组合,以达到使用建造者模式的过程。

[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_1-%E5%9C%BA%E6%99%AF%E6%A8%A1%E6%8B%9F%E5%B7%A5%E7%A8%8B)1. 场景模拟工程

itstack-demo-design-3-00
└── src└── main└── java└── org.itstack.demo.design├── ceilling│   ├── LevelOneCeiling.java│   └── LevelTwoCeiling.java├── coat│   ├── DuluxCoat.java│   └── LiBangCoat.java│   └── LevelTwoCeiling.java├── floor│   ├── DerFloor.java│   └── ShengXiangFloor.java├── tile│   ├── DongPengTile.java│   └── MarcoPoloTile.java└── Matter.java@小傅哥: 代码已经复制到剪贴板

在模拟工程中提供了装修中所需要的物料;ceilling(吊顶)、coat(涂料)、floor(地板)、tile(地砖),这么四项内容。(_实际的装修物料要比这个多的多_)

[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_2-%E5%9C%BA%E6%99%AF%E7%AE%80%E8%BF%B0)2. 场景简述

[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_2-1-%E7%89%A9%E6%96%99%E6%8E%A5%E5%8F%A3)2.1 物料接口
public interface Matter {String scene();      // 场景;地板、地砖、涂料、吊顶String brand();      // 品牌String model();      // 型号BigDecimal price();  // 价格String desc();       // 描述}@小傅哥: 代码已经复制到剪贴板
  • 物料接口提供了基本的信息,以保证所有的装修材料都可以按照统一标准进行获取。

    [#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_2-2-%E5%90%8A%E9%A1%B6-ceiling)2.2 吊顶(ceiling)

    **一级顶**

    public class LevelOneCeiling implements Matter {public String scene() {return "吊顶";}public String brand() {return "装修公司自带";}public String model() {return "一级顶";}public BigDecimal price() {return new BigDecimal(260);}public String desc() {return "造型只做低一级,只有一个层次的吊顶,一般离顶120-150mm";}
    

}

    @小傅哥: 代码已经复制到剪贴板

`**二级顶**`

public class LevelTwoCeiling implements Matter {

public String scene() {return "吊顶";
}public String brand() {return "装修公司自带";
}public String model() {return "二级顶";
}public BigDecimal price() {return new BigDecimal(850);
}public String desc() {return "两个层次的吊顶,二级吊顶高度一般就往下吊20cm,要是层高很高,也可增加每级的厚度";
}

}

    @小傅哥: 代码已经复制到剪贴板
`1`#### `[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_2-3-%E6%B6%82%E6%96%99-coat)2.3 涂料(coat)`
`**多乐士
23
**立邦地板(floor)``**德尔**`

public class DerFloor implements Matter {

public String scene() {return "地板";
}public String brand() {return "德尔(Der)";
}public String model() {return "A+";
}public BigDecimal price() {return new BigDecimal(119);
}public String desc() {return "DER德尔集团是全球领先的专业木地板制造商,北京2008年奥运会家装和公装地板供应商";
}

}

    @小傅哥: 代码已经复制到剪贴板
`**圣象**`

public class ShengXiangFloor implements Matter {

public String scene() {return "地板";
}public String brand() {return "圣象";
}public String model() {return "一级";
}public BigDecimal price() {return new BigDecimal(318);
}public String desc() {return "圣象地板是中国地板行业著名品牌。圣象地板拥有中国驰名商标、中国名牌、国家免检、中国环境标志认证等多项荣誉。";
}

}

    @小傅哥: 代码已经复制到剪贴板

#### `[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_2-5-%E5%9C%B0%E7%A0%96-tile)2.5 地砖(tile)`
`**东鹏**`

public class DongPengTile implements Matter {

public String scene() {return "地砖";
}public String brand() {return "东鹏瓷砖";
}public String model() {return "10001";
}public BigDecimal price() {return new BigDecimal(102);
}public String desc() {return "东鹏瓷砖以品质铸就品牌,科技推动品牌,口碑传播品牌为宗旨,2014年品牌价值132.35亿元,位列建陶行业榜首。";
}

}

    @小傅哥: 代码已经复制到剪贴板

`**马可波罗**`

public class MarcoPoloTile implements Matter {

public String scene() {return "地砖";
}public String brand() {return "马可波罗(MARCO POLO)";
}public String model() {return "缺省";
}public BigDecimal price() {return new BigDecimal(140);
}public String desc() {return "“马可波罗”品牌诞生于1996年,作为国内最早品牌化的建陶品牌,以“文化陶瓷”占领市场,享有“仿古砖至尊”的美誉。";
}

}

    @小傅哥: 代码已经复制到剪贴板
- `上就是本次装修公司所提供的装修配置单,接下我们会通过案例去使用不同的物料组合出不同的套餐服务。`
## `[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#%E4%BA%94%E3%80%81%E7%94%A8%E4%B8%80%E5%9D%A8%E5%9D%A8%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0)五、用一坨坨代码实现`
`讲道理没有ifelse解决不了的逻辑,不行就在加一行!`
`每一个章节中我们都会使用这样很直白的方式去把功能实现出来,在通过设计模式去优化完善。这样的代码结构也都是非常简单的,没有复杂的类关系结构,都是直来直去的代码。除了我们经常强调的这样的代码不能很好的扩展外,做一些例子demo工程还是可以的。`
### `[#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#_1-%E5%B7%A5%E7%A8%8B%E7%BB%93%E6%9E%84)1. 工程结构`

itstack-demo-design-3-01 └── src └── main └── java └── org.itstack.demo.design └── DecorationPackageController.java

    @小傅哥: 代码已经复制到剪贴板

``` 1 2 3 4 5 6 一个类几千行的代码你是否见过,嚯?那今天就让你见识一下有这样潜质的类!

**建造者模型结构** ![](https://img-blog.csdnimg.cn/b43877e98819491dab8526e301dd0e8e.png) 工程中有三个核心类和一个测试类,核心类是建造者模式的具体实现。与ifelse实现方式相比,多出来了两个二外的类。具体功能如下;

  • Builder,建造者类具体的各种组装由此类实现。

  • DecorationPackageMenu,是IMenu接口的实现类,主要是承载建造过程中的填充器。相当于这是一套承载物料和创建者中间衔接的内容。

  • [#](https://bugstack.cn/md/develop/design-pattern/2020-05-26-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%E3%80%8B.html#%E4%B8%83%E3%80%81%E6%80%BB%E7%BB%93)七、总结

  • 通过上面对建造者模式的使用,已经可以摸索出一点心得。那就是什么时候会选择这样的设计模式,当:一些基本物料不会变,而其组合经常变化的时候,就可以选择这样的设计模式来构建代码。

  • 此设计模式满足了单一职责原则以及可复用的技术、建造者独立、易扩展、便于控制细节风险。但同时当出现特别多的物料以及很多的组合后,类的不断扩展也会造成难以维护的问题。但这种设计结构模型可以把重复的内容抽象到数据库中,按照需要配置。这样就可以减少代码中大量的重复。

  • 设计模式能带给你的是一些思想,但在平时的开发中怎么样清晰的提炼出符合此思路的建造模块,是比较难的。需要经过一些锻炼和不断承接更多的项目,从而获得这部分经验。有的时候你的代码写的好,往往是倒逼的,复杂的业务频繁的变化,不断的挑战!

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 写入 influxdb

利用Python随机生成一个1000行的csv文件 import csv import random from datetime import datetime, timedelta from random import randint, choice# 定义监控对象列表和指标名称列表 monitor_objects [Server1, Server2, Server3, DB1] metric_names [CPUUsage, MemoryUsa…

网络编程 —— Http进度条

第一种下载带进度的方法 string url "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi"; 1使用getASync获取服务器响应数据 参数1请求的路径, 参数2 HttpCompletionOption.ResponseHeadersRead 请求完成时候等待请求带什么程度才…

耐高温输送带的优势

耐高温输送带:工业运输的革命性升级,助力生产线高效稳定运行 在现代化工业生产的浪潮中,耐高温输送带以其独特的优势,正逐渐成为工业运输领域的得力助手。它不仅能够有效提升生产效率,更能确保生产线的安全稳定运行&a…

算法随想录第二十天打卡|654.最大二叉树 , 617.合并二叉树 ,700.二叉搜索树中的搜索 , 98.验证二叉搜索树

654.最大二叉树 又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历 题目链接/文章讲解:代码随想录 视频讲解:又是构…

「动态规划」打家劫舍

力扣原题链接,点击跳转。 有一个小偷,要偷东西。假设有n个房间,每个房间都有现金,下标为i的房间内的现金数是nums[i]。不能同时偷相邻的2个房间,其中第一个房间和最后一个房间是相邻的。那么这个小偷最多能偷到多少现…

YOLOv8+PyQt5鸟类检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

资源包含可视化的鸟类检测系统,基于最新的YOLOv8训练的鸟类检测模型,和基于PyQt5制作的可视化鸟类检测系统,包含登陆页面、注册页面和检测页面,该系统可自动检测和识别图片或视频当中出现的各种鸟类,以及自动开启摄像头…

Linux汉化Jupyter Notebook

要在Linux系统中使Jupyter Notebook汉化,可以通过安装jupyterlab-language-pack-zh-CN扩展来实现。以下是具体步骤和示例代码: 打开终端。 执行以下命令以安装Jupyter Notebook的中文语言包: pip install jupyterlab-language-pack-zh-CN …

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片 1.背景2.接口 1.背景 System.Drawing.Common 是一个用于图像处理和图形操作的库,它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5 的跨平台特性,许多以前内置于 .NET Framework…

基于Fluent和深度学习算法驱动的流体力学计算与应用

“基于Fluent和深度学习算法驱动的流体力学计算与应用”专题大纲 目录 主要内容 机器学习与流体力学入门 一、流体力学基础理论与编程实战1、流体力学的发展概述 2、不可压缩流体力学的基本方程 3、湍流理论与湍流模型简介 4、傅里叶变换和流体的尺度分析 5、伪谱法求解不可压…

Vue小程序项目知识积累(二)

1.wx.reLaunch(Object object) 关闭所有页面,打开到应用内的某个页面。 wx.reLaunch({url:/pages/positons/index}) 参数说明: 属性类型默认值必填说明urlstring是需要跳转的应用内页面路径 (代码包路径),路径后可以带参数。参数与路径之…

微信小程序上传包过大的最全解决方案!

微信小程序的发布大小限制是2MB。然而一个程序怎么能这么小? 介绍一下项目中的经验。 新项目 如果是刚开始做的新项目,一定确定好自己要用的Ui框架,而且确定之后,千万不要引入别的,否则占大小!&#xff0…

HNCTF

HNCTF 文章目录 HNCTFBabyPQEZmathez_Classicf(?*?)MatrixRSABabyAESIs this Iso? BabyPQ nc签到题,跟端口连接拿到n和phin n 8336450100232098099043686671148282601664696810002345240872579498695511770993195704402414029892029461830476866385453475141207…

【开源】加油站管理系统 JAVA+Vue.js+SpringBoot+MySQL

目录 一、项目介绍 论坛模块 加油站模块 汽油模块 二、项目截图 三、核心代码 一、项目介绍 Vue.jsSpringBoot前后端分离新手入门项目《加油站管理系统》,包括论坛模块、加油站模块、汽油模块、加油模块和部门角色菜单模块,项目编号T003。 【开源…

如何使用jQuery重定向到另一个网页

在我们开始讨论如何重定向到另一个网页之前,必须明确一点:jQuery 是一个用于 DOM 操作的 JavaScript 库,因此你不应该使用 jQuery 来实现页面重定向。 jQuery 官方网站的某段话: 虽然 jQuery 可能能够在较旧的浏览器版本中运行,但我们并没有主动在这些版本中进行测试,也…

矩阵对角化在机器学习中的奥秘与应用

在机器学习的广阔领域中,矩阵对角化作为一种重要的数学工具,扮演着不可或缺的角色。从基础的线性代数理论到复杂的机器学习算法,矩阵对角化都在其中发挥着重要的作用。 矩阵对角化的概念与原理 矩阵对角化是矩阵理论中的一个基本概念&#x…

vue.config.js配置参考(2024-05-20)

vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 vue/cli-service 自动加载。 你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。 这…

综合布线管理软件有何作用?

当客户问及“综合布线管理软件究竟有何作用?” 我们通常这样回答: 综合布线管理软件,作为运维管理的得力助手,其核心功能旨在确保布线系统的稳定运行与快速响应。 首先,这款软件通过构建标准化的运维管理流程&#…

Qt for Android

文章 USB Qt for android 获取USB设备列表(一)Java方式 获取 Qt for android 获取USB设备列表(二)JNI方式 获取 Qt for android 串口库使用 异常处理 Qt for Android 乱码问题 andoid开发文档 UsbManager(apiref.…

四川汇聚荣科技有限公司好不好?

在当今科技飞速发展的时代,企业要想在激烈的市场竞争中脱颖而出,不仅需要先进的技术支持,还需要优质的服务和良好的口碑。那么,四川汇聚荣科技有限公司是否具备这些条件呢?接下来,我们将从公司实力、服务质量、客户反…

win10换ubuntu

1.首先是格式化windows系统,这里用的是恢复出厂设置 2.然后按照下面教程使用u盘来安装ubuntuUbuntu 20.04.2.0 LTS 系统安装过程详解 (从下载镜像到安装系统)_ubuntu安装教程20.04-CSDN博客 3.然后下面是一些别的准备工作: 1)安…