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;

posted @ 2019-07-18 23:03  何其小静  阅读(758)  评论(0编辑  收藏  举报