JDK、Spring和Mybatis中使用到的设计模式
一、JDK中的设计模式
(1)结构性模式
1.适配器模式
java.util.Arrays#asList()
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
java.xml.bind.annotation.adapters.xmlAdapter#mashal()
java.xml.bind.annotation.adapters.xmlAdapter#mashal()
2.桥接模式(将抽象和抽象的具体实现进行解耦,这样可以使得抽象和抽象的具体实现可以独立进行变化。)
JDBC
3.组合模式(让客户端看起来在处理单个对象和对象的组合是平等的,换句话说,某个类型的方法同时也接受自身类型作为参数。)
Java.util.List#addAll(Collection)
Java.util.Set#addAll(Collection)
Java.util.Map#addAll(Map)
4装饰者模式
Java.io.BufferedInputStream(InputStream)
5.门面模式
java.lang .Class
6.享元模式(使用缓存来减少对小对象的访问时间)
Java.lang.Integer#valueOf(int)
Java.lang.Bollean#valueOf(boolean)
Java.lang.Byte#valueOf(byte)
Java.lang.Character#valueOf(char)
7.代理模式
java.lang.reflect.Proxy
(2)创建模式
8.抽象工厂模式
java.sql.DriverManger#getConnection()
java.sql.connection#createStatement()
java.text.NumberFormat#getInstance()
java.util.Calender#getInstance()
9.建造者模式
Java.lang.StringBuilder#apend()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
10.工厂方法
Java.lang.Proxy#newProxyInstance()
java.lang.Object#toString()
java.lang.Class#newInstance()
java.lang.Class#forName()
Java.lang.Bollean#valueOf(String)
11.原型模式(使得类的实例能够生成自身的拷贝。)
java.lang.Object#clone()
java.lang.Cloneable
12.单例模式
java.langRuntime#getRuntime()
spring中的bean
13.行为模式(通过把请求从一个对象传递到链条中下一个对象的方式来解除对象之间的耦合,直到请求被处理完毕。)
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
14.命令模式(将命令包装在对象中,以便可以将其存储,传递到方法中,并像任何其他对象一样返回。)
java.lang.Runnable()
15.解释器模式
Java.text.Format
16.迭代器模式
Java.uil.Iterator
17.中介者模式(通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。)
Java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()
18.空对象模式(它允许您抽象空对象的处理。)
java.util.Collections#emptyList()
java.util.Collections#emptyMap()
java.util.Collections#emptySet()
19.观察者模式
java.util.EventListener
java.servlet.http.HttpSessionBindingListener
java.servlet.http.HttpSessionAttributeListener
20.状态模式(允许您在运行时根据内部状态轻松更改对象的行为。)
Java.uil.Iterator
Java.faces.lifecycle.LifeCyele#execute()
21.策略模式(使用这个模式来将一组算法封装成一系列对象)
java.util.Comparator#comoare()
java.servlet.http.HttpServlet
java.servlet.Filter#doFilter()
22.模板方法模式(让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。)
Java.util.Collections#sort()
java.io.InoutStream#read()
java.util.AbstractList#indexOf()
23.访问者模式(提供一个方便的可维护的方式来操作一组对象。它使得你在不改变操作的对象前提下,可以修改或者扩展对象的行为。)
https://mp.weixin.qq.com/s/QwlkU1T4RQaRqgs9uI3cPg
二、Spring 中使用的设计模式
1.简单工厂模式
spring中的BeanFactory
2.工厂方法模式
通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。
应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。
Spring中的FactoryBean就是典型的工厂方法模式。
3.单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope="?"来指定。
4.代理模式
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。
2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,
通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。
5.观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
6.策略模式
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
spring中在实例化对象的时候用到Strategy模式
7.模板方法模式
spring中的JdbcTemplate。
8.包装器模式
Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
9.适配器模式
实现方式:SpringMVC中的适配器HandlerAdatper。
实现原理:HandlerAdatper根据Handler规则执行不同的Handler。
实现过程:
DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,
执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
实现意义:
HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。因此Spring定义了一个适配接口,使得每一种Controller
有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。
三、mybatis中使用的设计模式
1.Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
2.工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
3.单例模式,例如ErrorContext和LogFactory;
4.代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
5.组合模式,例如SqlNode和各个子类ChooseSqlNode等;
6.模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
7.适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
8.装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;
9.迭代器模式,例如迭代器模式PropertyTokenizer;
JDK、Spring和Mybatis中使用到的设计模式的更多相关文章
- 2017年9月3日 Spring及Mybatis中连接数据库的不同方式
连接数据库用spring和mybatis中使用的方法可以不同,mybaits可以不用写数据库的配置文件 Spring的连接方法 <!-- 读取属性文件(.properties)的内容 --> ...
- spring Mvc + Mybatis 中使用junit
在Spring Mvc + Mybatis的项目中我们有时候需要在测试代码中注入Dao操作数据库,对表进行增删改查,实现如下: 这是一般的maven项目项目结构 测试代码一般写在src/test/ja ...
- spring 整合 mybatis 中数据源的几种配置方式
因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...
- MyBatis从入门到精通(第9章):Spring集成MyBatis(中)
MyBatis从入门到精通(第9章):Spring集成MyBatis(中) 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.应该将应用自身的设计和具体 ...
- mybatis中使用到的设计模式
Mybatis中使用到了哪些设计模式呢?下面就简单的来介绍下: 1.构造者模式: 构造者模式是在mybatis初始化mapper映射文件的过程中,为<cache>节点创建Cache对象的方 ...
- spring+springMVC+Mybatis 中使用@Transcational方式管理事务的配置方法
springMVC 中,事务通常都在service层控制,当然controller层也可以用事务,只要配置配对,但通常不建议直接在controller层配事务,controller的作用是管理参数以及 ...
- spring与mybatis五种整合方法
1.采用数据映射器(MapperFactoryBean)的方式 不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1)Spring配置文件: <!-- 引入jdbc ...
- 你所不知的spring与mybatis整合方法
内容目录 1.采用MapperScannerConfigurer2.采用接口org.apache.ibatis.session.SqlSession的实现类org.mybatis.spring.Sql ...
- mybatis中两种取值方式?谈谈Spring框架理解?
1.mybatis中两种取值方式? 回答:Mybatis中取值方式有几种?各自区别是什么? Mybatis取值方式就是说在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ ...
随机推荐
- win10和浏览器快捷键
1. Win10快捷键[Win+↑/↓/←/→] 将当前窗口按比例固定到屏幕的四个边角,如左上.右上.左下.右下.[Win+1/2/3…] 按顺序打开任务栏上的已固定程序(不包括第一个“任务视图”按钮 ...
- Promise 学习心得
当了这么久码农到今天没事才开始去深究 Promise 这个对象 什么是 Promise, Promise 有什么用? 在写代码的时候多多少少都有遇见过地狱式的回调 代码看起来没问题就是有点乱,Prom ...
- 记一次mysql主从同步因断电产生的不能同步问题 1236 1032
背景: 项目新上线一个月,qa需要测试断电服务拉起,服务拉起成功后,发现mysql主从异常,以下是发现的问题以及解决方案 问题1: Slave_IO_Running: No 一方面原因是因为网络通信 ...
- 【KakaJSON手册】04_JSON转Model_04_值过滤
在KakaJSON手册的第2篇文章中提过:由于JSON格式能表达的数据类型是比较有限的,所以服务器返回的JSON数据有时无法自动转换成客户端想要的数据类型 比如客户端想要的是Date类型,服务器返回的 ...
- Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- 后端开发之chrome开发者模式
1. 场景描述 java开发前后端分离模式越来越流行,后端人员可以直接使用swagger进行接口调试(前后端分离之Swagger2),但是调试的时候,需要设置入参,假如该模块不是软件老王开发的,接别人 ...
- Nacos(一):Nacos介绍
前言 6月份阿里开源的Nacos出了1.0.1版本,从去年7月份第一个release版本到现在一直在默默关注 官方的版本规划为:Nacos从0.8.0开始支持生产可用,1.0版本可大规模生产可用,2. ...
- 【记录】SpringBoot 2.X整合Log4j没有输出INFO、DEBUG等日志信息解决方案
由于批量更新的时候一直无法定位问题出处,就去服务器定位日志,奈何日志一直无法输出,为了能够更好的定位问题,痛定思痛后逐步排查最终解决问题.如有客官看到此处,请不要盲目对号入座,我的项目环境或许与你有区 ...
- java 判断 string 转 integer 判断
NumberUtils.isDigits("1") NumberUtils.isDigits("/") 根据返回 true false 再确定是否转换即可 需要 ...
- 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
内容不转载了,加上链接https://blog.csdn.net/u013565368/article/details/53081195?_t=t