关于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最新面试题

评论

发表回复

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

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理