平时代码中用不到设计模式?Are you kidding me?
引子
平时我是个反应非常慢的人。有多慢呢?大概是两年前有次团队内部开会时,我听到同学说平时代码中用不到设计模式,我当时没有回答。两年后我终于反应过来了:“Are you kidding me?我每天都在用!”
应用场景
建造者模式
写一个接口,入参是一大堆,什么都有。这是长期积累下来的代码,参数都提供给外部用了。只能做加法,不能做减法。这时候接口就这样了,内部能不能好看点呢?
可以啊,重构,留壳抠瓤啊!

这一堆参数可以封装成一个有意义的类,再往下传递处理。这时候就用到了建造者模式,对参数进行封装。构造一个静态builder函数,将参数传进去,返回是一个对象。
例子如下:
这是构造一个“人”的对象。builder函数建议放到“人”这个对象里,因为这样从领域上来说更合理更清晰。
@Data
@Accessors(chain = true)
public class Person {
private String name;
private int armCount=2;//胳膊数默认为2
private int legCount=2;//腿数默认为2 private Person(String name) {
this.name = name;
} public static Person builder(String name) {
return new Person(name);
}
}
适配器模式
大家现在用mysql都喜欢用mybatis-generator工具自动生成部分代码。里面的对象一般称为领域对象。在上层给用户返回结果的时候一般不直接用。因为信息太多了。比如数据库中固定结构的字段:创建时间、更新时间、是否为逻辑删除列这些,更好的一个方式是对外不可见。这时候就要对领域对象和传输层对象之间做一个转换,这时候用到适配器模式。
下面是使用BeanUtils将对象之间做适配的例子:
private static QuotaResponse toQuotaResponse(Quota quota) {
QuotaResponse quotaResponse = new QuotaResponse();
BeanUtils.copyProperties(quota, quotaResponse);
return quotaResponse;
}
观察者模式
数据库设计时常用的一种表结构设计方式是子母表。比如可以为“人”设计一张数据表。军人、工程师、特工有各自不同的属性,它们是“人”这张数据表的关联子表。为了展示时候的效率,将这些子母表展开,另外做一张展示表。
在写一个定时任务时,如果扫描到“人”的状态状态更新了。比如“人”的胳膊数变了,这时候可以通知这些展示表,状态都更新了。
举个例子:
因为九头蛇在街头横行,见人就砍,出现了一些残疾人。神盾局特工Fitz(菲兹)正在研制一种肢体再生技术,这个技术完成将会是包括人在内的所有动物的福音。因此,人类医院和动物医院都作为观察者都订阅了Fitz的项目状态。一旦完成,这些医院都会得到通知。
定义医院作为观察者的通用接口
public interface Observer {
void update(boolean isFinish);
}
Fitz开放了一个attach方法,任何单位都可以实现Observer接口后通过这个方法被加入通知列表,一旦完成,Fiz将通知所有观察者:
public class Fitz {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer) {
observers.add(observer);
}
public void finish() {
notifyAllObservers();
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update(true);
}
}
}
总结
代入思考,技术提升的关键
推荐阅读
关于作者
一线开发十二年,有日本东京和美国硅谷研发经验。有百余项技术发明专利,目前任美团点评技术专家。有自己的技术公众号「编程一生」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。

平时代码中用不到设计模式?Are you kidding me?的更多相关文章
- 【转载】OGRE中用到的设计模式
原文:OGRE中用到的设计模式 1. 单例模式(Singleton) 2. 工厂方法(Factory Method) 3. 适配器模式(Adapter) 4. ...
- 【软件构造】第八章第三节 代码调优的设计模式和I/O
第八章第三节 代码调优的设计模式和I/O 本节学习如何通过对代码的修改,消除性能瓶颈,提高系统性能?——代码调优.面向性 能的设计模式 Outline Java调优 代码调优的概念 单例模式(Sing ...
- Spring中用了哪些设计模式
1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...
- spring中用到哪些设计模式?
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话 ...
- 【Spring】Spring中用到的设计模式
1.简单工厂 又叫静态工厂方法模式,不属于23种设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. Spring中的BeanFactory就是简单工厂模式的 ...
- 了解一下Spring中用了哪些设计模式?这样回答面试官才稳
一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. ...
- 设计模式 | Spring中用到的设计模式,你知道几个?
设计模式无处不在,因为它就来自于我们的日常生活,提炼于生活经验. 正握在你手中的手机,不能用220V的电压直接充电,需要一个专门的电源适配器(充电器)才行.摆在你桌上的电脑也是一样的,都需要" ...
- Mybatis中用到的设计模式
Mybatis中用到至少用到以下设计模式, Builder模式,例如SqlSessionFactoryBuilder.XMLConfigBuilder.XMLMapperBuilder.XMLStat ...
- spring中用到哪些设计模式
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了: 2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationCon ...
随机推荐
- 基于windows server 2016和sqlserver 2016 AlwaysOn的群集配置
文档:基于windows server 2016和sqlserver 2...链接:http://note.youdao.com/noteshare?id=4f07c1c3f7d0e32b7631d7 ...
- Linux下的密码破解
密码散列: 密码散列的$6 表示是:SHA512 这里我们使用hashcat 工具进行破解 ╰─ hashcat -m 1800 hash.txt /usr/share/wordlists/rocky ...
- leaflet-webpack 入门开发系列六矢量瓦片(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 使用Navicat Keygen激活(破解)Navicat Premium 12
1.到Navicat官网下载使用版本进行安装,具体操作不再详述.Navcat官网下载链接:http://www.navicat.com.cn/download/navicat-premium : 2. ...
- IT兄弟连 HTML5教程 CSS3属性特效 3D变换1
3D变换较2D变换多了一下的转换属性,3D转换属性及描述如表1: 表1 3D转换属性 3D的转换方法如表2: 表2 3D转换方法 1 transform-style transform- ...
- LeetCode 二叉树的锯齿形层次遍历
第103题 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...
- opengl画不出直线 线段 坐标轴 却能画出其他图形的坑
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12054507.html 好多次都是画坐标轴的三条直线画不出来,虽然最后都解决了 但是还是耽误 ...
- 卡拉OK歌词原理和实现高仿Android网易云音乐
大家好,我们是爱学啊,继上一篇讲解了[LRC歌词原理和实现高仿Android网易云音乐],今天给大家带来一篇关于卡拉OK歌词原理和在Android上如何实现歌词逐字滚动的效果,本文来自[Android ...
- find 常用命令
系统中总会不断产生一些文件,比如日志文件,不一定会用到也不会自动删除,这时候就需要手动删除,当然也可以转存到其他目录下.不好找的时候可以用find模糊查找,加个job定时任务自动执行定期删除文件1.添 ...
- Appium使用总结
目前在使用appium过程中遇到的一些问题及规避方法总结如下: Appium使用总结:1.在熄屏下启动测试,会自动唤醒屏幕2.Appium只针对单个应用测试3.使用unittest框架,该框架中每条用 ...