乐趣区

关于java:设计模式-Spring中用到的设计模式你知道几个

设计模式无处不在,因为它就来自于咱们的日常生活,提炼于生存教训。

正握在你手中的手机,不能用 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 最新面试题

退出移动版