JDK、Spring和Mybatis中使用到的设计模式

时间:2022-09-16 17:32:37

一、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中使用到的设计模式的更多相关文章

  1. 2017年9月3日 Spring及Mybatis中连接数据库的不同方式

    连接数据库用spring和mybatis中使用的方法可以不同,mybaits可以不用写数据库的配置文件 Spring的连接方法 <!-- 读取属性文件(.properties)的内容 --&gt ...

  2. spring Mvc &plus; Mybatis 中使用junit

    在Spring Mvc + Mybatis的项目中我们有时候需要在测试代码中注入Dao操作数据库,对表进行增删改查,实现如下: 这是一般的maven项目项目结构 测试代码一般写在src/test/ja ...

  3. spring 整合 mybatis 中数据源的几种配置方式

    因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...

  4. MyBatis从入门到精通&lpar;第9章&rpar;:Spring集成MyBatis&lpar;中&rpar;

    MyBatis从入门到精通(第9章):Spring集成MyBatis(中) 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.应该将应用自身的设计和具体 ...

  5. mybatis中使用到的设计模式

    Mybatis中使用到了哪些设计模式呢?下面就简单的来介绍下: 1.构造者模式: 构造者模式是在mybatis初始化mapper映射文件的过程中,为<cache>节点创建Cache对象的方 ...

  6. spring&plus;springMVC&plus;Mybatis 中使用&commat;Transcational方式管理事务的配置方法

    springMVC 中,事务通常都在service层控制,当然controller层也可以用事务,只要配置配对,但通常不建议直接在controller层配事务,controller的作用是管理参数以及 ...

  7. spring与mybatis五种整合方法

    1.采用数据映射器(MapperFactoryBean)的方式 不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数.  (1)Spring配置文件: <!-- 引入jdbc ...

  8. 你所不知的spring与mybatis整合方法

    内容目录 1.采用MapperScannerConfigurer2.采用接口org.apache.ibatis.session.SqlSession的实现类org.mybatis.spring.Sql ...

  9. mybatis中两种取值方式&quest;谈谈Spring框架理解&quest;

    1.mybatis中两种取值方式? 回答:Mybatis中取值方式有几种?各自区别是什么? Mybatis取值方式就是说在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ ...

随机推荐

  1. swift 学习笔记

    1. 数组中取出字符串的方法: 1)let string = "\arr[0]" 2) let string = String(stringInterpolationSegment ...

  2. thinking in object pool

    1.背景 对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池. 2.问题 目前纵观主流语言的实现方式无外乎3个步 ...

  3. &lbrack;NOIP2010&rsqb; 提高组 洛谷P1541 乌龟棋

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  4. 开源top100

    1.SwitchyOmega 项目简介:SwitchyOmega 是 SwitchySharp 的新版本.这是一个 Chrome 浏览器用来切换不同代理的插件.SwitchyOmega 初次安装时会检 ...

  5. Mysql 联结表

  6. 基于等待队列及poll机制的按键驱动代码分析和测试代码

    按键驱动分析: #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> ...

  7. HDU1029时钟(排序)

    题意:是用两个指针的一个模拟时钟的时针和分针.两个指针形成一个角度.角度测量两个指针之间的最小角度.两只手之间的角度是大于或等于0,且小于或等于180度的度量.由于一个序列的五个不同的写入时间,格式为 ...

  8. 小程序--改变子级别页面导航栏信息 &sol; navigationBarTitleText

    微信小程序在公共文件app.json中设置了导航栏相关样式如下: 其中  navigationBarTitleText 为设置导航栏名称,若是想子级页面和父页面的header页面不同,则在子级文件中新 ...

  9. pwnable&period;tw calc

    题目代码量比较大(对于菜鸡我来说orz),找了很久才发现一个能利用的漏洞 运行之发现是一个计算器的程序,简单测试下发现当输入的操作数超过10位时会有一个整型溢出 这里调试了一下发现是printf(&q ...

  10. net core体系-2继续认识net core

    认识net core,net core到底啥?从哪说起呢?我想作为开发的码农,web项目不陌生吧,那就从对应的.net web 对应的net core Web Application项目开始吧. 下面 ...