共计 2773 个字符,预计需要花费 7 分钟才能阅读完成。
设计模式无处不在,因为它就来自于咱们的日常生活,提炼于生存教训。
正握在你手中的手机,不能用 220V 的电压间接充电,须要一个专门的电源适配器 (充电器) 才行。摆在你桌上的电脑也是一样的,都须要“适配”。而 适配器模式(Adapter Pattern)正是由此总结而来。
从一个问题登程,为什么 Spring 这么牛?
Spring 倒退到明天,在 Java 开发中的位置毋庸置疑。人人都在用 Spring,80% 的开发者学完 Java 就得学习 Spring 了。那 Spring 为啥这么牛呢?其中必定很大一部分起因就是因为Spring 是一个把设计模式用的酣畅淋漓的框架。从类名中就能体现进去。
设计模式 | 举例 | |
---|---|---|
工厂模式 | Factory | BeanFactory |
装璜者模式 | Wrapper | BeanWrapper |
代理模式 | Proxy | AopProxy |
委派模式 | Dispatcher | DispatcherServlet |
策略模式 | Handler | HandlerMapping |
适配器模式 | Adapter | HandlerAdpter |
模板模式 | Template | JdbcTemplate |
观察者模式 | Listener | ContextLoaderListener |
小伙伴们,连忙关上你的 idea,应用下面的关键词进行搜寻,将会取得一个新的视角去扫视咱们的 Spring 源码了。前言就到这里,那咱们就正式进入明天的主题,设计模式
设计模式的由来
当初咱们议论的设计模式,没有特地阐明的话,通常上就是指的 1995 年 GoF(Gang of Four 四人组)所编写的 Design Patterns: Elements of Reusable Object-Oriented Software 一书,该书蕴含了 23 种设计模式。通常也被人称为 GoF 23。
在这里大炮就不介绍全副了,网上一搜一大把,而且有些模式的确用的比拟少。所以只列出罕用的十种,也是比拟重要的十种,大家看下,如果有不会的前面也会有专门的章节讲到的。
类型 | 名称 | 英文名 |
---|---|---|
创立型 | 工厂模式 | Factory Pattern |
单例模式 | Singleton Pattern | |
原型模式 | Prototype Pattern | |
结构型 | 适配器模式 | Adapter Pattern |
装璜器 | Decorator Pattern | |
代理模式 | Proxy Pattern | |
行为型 | 策略模式 | Strategy Pattern |
模板模式 | Template Pattern | |
委派模式(不属于 GoF 23) | Delegate Pattern | |
观察者模式 | Observer Pattern |
可能有些读者留神到下面委派模式,并不属于 GoF 23。没错,设计模式并不局限于 GoF 提出的,毕竟他们也是基于集体经验总结进去的。如果哪天你忽然脑中灵光一闪,通过本人的教训也总结进去一个模式,并且能很好地解决一些问题,那也是齐全正当 OK 的。
为什么要应用设计模式
讲了这么多,为啥要用设计模式呢?我就是不必不行嘛?其实这两个问题,认真考虑就会发现它完完全全就是个伪命题。咱们每个人都是在“不得不“和“不盲目”的应用设计模式。咱们来看 Mybatis 中的一个例子:
SqlSession 是一个接口,这里定义了对数据库的一大堆基本操作。咱们对数据库的操作都离不开它,这里咱们不看具体实现,只剖析构造。它有三个实现类:
重点关注这个默认的 DefaultSqlSession 是怎么创立的。咱们还是只剖析构造。
能够看到,创立的步骤是很多的,入参就有三个,还调用了好几个子办法,最终只是为了拿到 DefaultSqlSession 的实例,就是这句:
new DefaultSqlSession(configuration, executor, autoCommit);
试想,如果每个须要 DefaultSqlSession 的实例的调用者都须要写这么一大串,那得写多少反复代码?万一创立过程有改变,咱们得改多少个中央?所以咱们会 很天然 的想到把它抽到一个 公共的中央,每次须要他,就去公共的中央拿就行了。即便有改变,也只需改变这个公共办法即可。平时咱们的各种工具类,各种 Util 之类的,都是基于这个很直白,很天然的教训。
其实针对这个 openSessionFromDataSource(),就是一个十分规范的工厂模式的体现:工厂生产一个标准化的产品,大家须要这个产品都来我这里拿就行了,并不需要关注其中的细节。而下面 openSessionFromDataSource()办法,正是出自 DefaultSqlSessionFactory,就是专门提供 DefaultSqlSession 实例的工厂。略微看它一眼:
它重载了很多个 openSession()办法,但最终都是调用 openSessionFromDataSource()办法实现创立的。
从这个例子再次登程,咱们尝试猜下:它是从一开始的现场造轮子,而后到自然而然的应用设计模式,来感触下演变过程,首先是发现问题:
而后咱们很天然的想到,把这些雷同的逻辑、代码,放到一个公共办法外头,openSessionFromDataSource()办法应运而生,然而这个办法总得放一个中央吧,必定不能是在各自的 Service 外面,因为还是反复了嘛,所以很天然的新建一个类:
前面通过 GoF 的总结和提炼,它,Factory Pattern,工厂模式就这么呈现了。其余设计模式的诞生和这个是一样的,发现具有特征的问题 => 解决问题 => 提炼特色教训 => 造成设计模式。
从这个过程咱们能够领会到,是因为咱们先去这么做了,通过提炼和总结,才有设计模式的诞生。
综上所述,不必设计模式也是能够失常实现咱们须要的性能的。然而咱们就是这么 自然而然 地应用了,毫无违和感。从这也能得出一个论断,也应证了这篇文章的引言局部:设计模式来源于教训(生存教训、开发教训)的总结。
总结
看了下面的例子,咱们能够对设计模式做一些总结:
- 设计模式是生存中经验总结。
- 不应用设计模式也能解决问题,但容易让我的项目变成“屎山”,难以扩大和保护。应用设计模式能让代码变得“优雅”,易于保护、易于拓展,并且节省时间(生命)。
- GoF 的公布的设计模式一书造成了一种规范。呈现了很多的关键字,比方 Factory、Adapter,前人应用设计模式都会应用这些关键字来命名。Spring 源码就是一个很好地例子,所以 想看懂 Spring 源码,肯定要学习设计模式。
应用设计模式的准则:
不是为了用而强行应用设计模式,应用的过程应该是很天然的。诶,我须要用到这个模式能力很好的解决问题,所以我要用。
明天就到这里了,祝大家 七夕高兴 ,没有对象的都能 今晚脱单。下一篇就是单个设计模式的精讲篇了,咱们下期再见~
往期举荐
设计模式 | 4 分钟搞懂 10 种设计模式
蔡大炮筹备正式倒闭啦
家雄又写 bug 了
家雄别睡了,快起来改 bug
原创不易,求个三连激励下吧
微信搜寻 java-caidapao,关注大炮~ 回复“面试题”,支付 2020 最新面试题