Spring中常用设计模式总结

Spring中常用的设计模式总结

之前写的几篇设计模式总结,其实主要是为了阅读spring源码服务的,这里对之前的一些设计模式来一个简单的总结

1、单例模式

总结的博文如下:单例模式总结

单例模式,主要目的是保证实例的独一无二,提高资源的重复利用。单例模式的难点就在于需要通过代码来维护系统中实例的唯一性,需要确保各种线程不安全环境下实例的独一性。

常用于配置文件的读取,监控程序,IOC容器等,spring中最常用的单例实现方式就是注册登记式的单例模式,这个后面看源码的时候,会深入了解

一句话总结:保证独一无二

2、原型模式

原型模式

原型模式其实就是针对复制而言的一种模式,原型模式中需要弄清浅复制和深复制的区别。

浅复制:对于数据类型是基本数据类型的成员变量,浅复制直接进行值的传递,即将原始对象中属性的值复制一份给新对象;对于引用数据类型的成员变量,浅复制就只是传递引用,这样使得两个对象之间其实操作的是同一份数据

深复制:就是在浅复制的基础上,完成对象引用的深层次的复制。深复制不仅要复制对象所有的基本数据类型,还要在复制过程中为原有的引用数据类型开辟新的存储空间,将引用对象的数据拷贝到新开辟的存储空间中。一定程度上来说,对象进行深复制就是要对整个对象图进行复制。

更为形象的图形解释可以参考这篇博客——深复制与浅复制的区别

原型模式主要就是应用于对象间的复制。spring中我们在配置对象的scope的时候,将scope配置成为prototype,即将bean配置成多例的,其中就会用到原型模式。

一句话总结:复制作用

3、代理模式

代理模式

代理模式之前在理解的过程中花了比较大的力气,从总体来开代理模式的作用就是在某一个类中某一指定的方法执行之前和执行之后,织入一些增强逻辑,这个理解依旧有点绕,但是结合AOP来理解就不难了,AOP的主要作用就是在目标方法的执行前和执行后织入一些增强的逻辑。

代理通常分为静态代理和动态代理,由于静态代理在扩展性方面的不足才引出了动态代理。

动态代理的实现方式常见的有两种:一种是JDK Proxy,另一种是CgLib,前者是动态植入,后者是继承;前者要求目标类要实现一个接口,目的就是方便获取方法信息,方便JDK利用反射动态调用。使用JDK动态代理的时候,增强的逻辑类需要实现InvocationHandler接口,在其中的invoke方法中去编写增强逻辑。CGLib相对来说就容易的多,具体可以参看原文,原博客文章中还对JDK底层的原理做了详细的探讨,手动编写了动态代理实现过程。

动态代理在spring中用的较多,典型的AOP就是用的代理。除此之外,结合实际来看,如果针对原有的目标需要动态进行增强都可以利用动态代理模式

一句话总结:买票找黄牛,办事找代理。

4、策略模式

策略模式

策略模式是比较好理解的一种设计模式,该模式就是封装了一些算法供用户选择,根据用户的选择如何确定到指定的算法策略的过程中,为了避免使用if...else或者switch这种选择语句,就需要结合工厂模式进行使用,因此策略模式一定程度上并不单独使用

使用场景:支付方式的选择

一句话总结:我走那条路,我做主

5、模板方法模式

模板方法模式

模板方法模式也是一个比较好理解的设计模式,无非就是在估计的流程中,加入一些不同的算法实现,最终产生出不同的结果而已,提供的模板一般采用抽象类来实现,需要加入自己的算法的时候,就通过继承这个抽象类来完成。

使用场景:JdbcTemplate,工作流,spring-orm

一句话总结:流程标准化,原料自己加

6、委派模式

委派模式

委派模式某一种程度上是代理和策略模式的结合,在实现过程中,最重要的就是对委派列表的维护,这在之前的博客中实现的比较简单,直接值委派者中维护了引用。

使用场景:spring 中的DispatcherServlet、Delegate命名结尾的都是委派模式

一句话总结:项目经理委派活给普通员工

7、适配器模式

适配器模式

适配器模式从命名来看也能理解其意思,需要和装饰者模式区分开来。针对两者的区别还是列出一个类图吧,这个实例是分别在两个模式的博客文章中实现过的


使用场景:DataAdapter

一句话总结:转换头

8、装饰者模式

装饰者模式

一定程度上来讲,装饰者模式与适配器模式有点类似,两者的具体区别上面的图中已经很好的展示出来了

使用场景:spring中以Decorate结尾的都是使用的装饰者模式,IO流的设计,数据源

一句话总结:同宗同源的增强

9、观察者模式

观察者模式

只需要理清楚两个角色,消息发布者和消息订阅者,难点在于消息发布者如何维护多个消息订阅者的信息

使用场景:消息队列,swing中的监听器,spring中的监听器

一句话总结:完成时通知一下。

补充

以上学习的设计模式主要是为了阅读spring源码打基础,针对其他设计模式,后面在工作中接触到了,可以进行深入学习,总的来说需要多总结,多思考,擅于通过类图来理解设计模式。

猜你喜欢

转载自blog.csdn.net/liman65727/article/details/79762475