前言
通过之前对mybatis源码的学习,我们可以看见mybatis采用了很多设计模式,使代码变得优雅简洁(逼格高),我们一起来学习下它设计模式的使用吧.
1.工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
mybatis的数据源模块中创建数据源就是使用的工厂模式.数据源工厂并不暴露创建数据源的逻辑,只是提供创建的接口.
2.建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
MappedStatement.Builder
Discriminator.Builder
3.适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
mybatis的日志模块就是适配器模式的实现的.mybatis定义了日志的接口Log
它的实现类通过适配器模式集成的其他插件的日志功能.例如Log4jImpl等
4.装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
mybatis的缓存功能是装饰器模式最佳实践.
Cache接口的每个实现类都在提供缓存的基础上增加了额外的功能.
缓存的核心功能由内部的代理实现.例如LoggingCache就是增加了日志打印功能.
LruCache就是增加了LRU算法的实现,对单纯的缓存进行了装饰,增加了LRU功能.
5.模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
mybatis的BaseExecutor就是使用了模板模式.它定义了query,queryCursor,update等方法的执行流程.但是具体的实现doUpdate,doQuery等需要子类实现
6.代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
ConnectionLogger就是完成了对Connection的代理.对他的prepareStatement和prepareCall还有createStatement等方法进行增强,增加了日志打印,还有生成了动态代理对象的PreparedStatement
总结
今天我们学习了mybatis中关于设计模式的实现.可见优秀的框架从不缺乏设计模式的身影.
大家在mybatis中还发现了哪些设计模式的身影呢,一起留言讨论吧.
喜欢的小伙伴请动动小手关注和点赞吧,也可留言一起探讨怎样更好的学习源码!!!
mybatis带中文注释源码地址
文章链接
Mybatis源码学习(一)初探执行流程
Mybatis源码学习(二)配置文件解析到SqlSessionFactory构建
Mybatis源码学习(三)SqlSession详解
Mybatis源码学习(四)自定义Mapper方法执行流程
Mybatis源码学习(五)Executor和StatementHandler详解
Mybatis源码学习(六)结果集自动封装机制
Mybatis源码学习(七)mybatis缓存详解
Mybatis源码学习(八)Mybatis设计模式总结