Mybatis中用到的设计模式

1. 建造者(Builder)模式:

  表示一个类的构建与类的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,他只允许用户只通过指定复杂对象的类型和内容就可以构建它们。

  比如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder。

  SqlSessionFactoryBuilder为例。模式结构:SqlSessionFactoryBuilder为具体的建造者,他没有抽象建造者父类,因为只有它一个,构建完生命周期也结束了,SqlSessionFactoryBuilder依赖于SqlSessionFactory,SqlSessionFactory的构建交给SqlSessionFactoryBuilder,表示SqlSessionFactory类的构建(SqlSessionFactoryBuilder)与SqlSessionFactory类的表示分离。

2. 工厂方法模式:

  核心的工厂类不再负责所有产品的创建,而是将创建的工作交给产品接口的子类去做,这个工厂类必须为其实现接口,而不负责某一类产品实例化这种细节。

  比如SqlSessionFactory、MapperProxyFactory、ObjectFactory。

  以构建SqlSessionFactory为例。模式结构为:具体工厂DefaultSqlSessionFactory生产具体产品DefaultSqlSession ,具体产品有一抽象产品接口SqlSession,DefaultSqlSessionFactory有一个抽象工厂接口SqlSessionFactory

Mapper的配置映射

3. 装饰者模式:

  动态地给一个对象增加一些额外的职责,装饰模式比实现子类效率会高,可以称为包装器。

  比如说Mybatis的执行器。模式结构:Executer(抽象构件),CachingExecutor(具体构件),BaseExecutor(抽象装饰类),SimpleExecutor 和 ReuseExecutor(具体装饰类)。

  还有Mybatis的缓存Cache,Cache (组件对象的接口),PerpetualCache(具体组件,是我们需要装饰的对象),LruCache等其他类(具体装饰类,被装饰的对象)

org.apache.ibatis.cache包结构:

4. 适配器模式:

  将一个类的接口转换成希望的另外一个接口。

  最常见于logger日志那一块。

  模式结构:Log就是要转化的目标接口(Target ),各个子包下的实现类就是各种日志框架的适配器(Adapter),在这个Mybatis包之外的日志框架的Logger就是要适配的类(Adaptee)

5. 代理模式:

  JDK的动态代理,详见 探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

6. 模板模式:

  定义一个抽象类,里面有一系列基本操作,这些操作可以是具体的,也可以是抽象的,每一个基本步骤对应算法的一个步骤,再其子类中可以重定义并实现一个算法的各个步骤。

  比如说Myabtis中抽象的执行器BaseExecutor。模式结构:抽象类BaseExecutor,具体子类主要是SimpleExecutor、ReuseExecutor、BatchExecutor这三个。

7. 单例模式:

  保证一个类仅有一个实例。

  比如说ErrorContext、LoggerFactory

  ErrorContext:

  LogFactory:

  LogFactory是用自己的class和要被适配的日志类的class,通过setImplementation用Construction构建起来的一个单例logConstructor,tryImplementation保证它是单例的。

 1 private static void tryImplementation(Runnable runnable) {
2 if (logConstructor == null) {
3 try {
4 runnable.run();
5 } catch (Throwable t) {
6 // ignore
7 }
8 }
9 }
10
11 private static void setImplementation(Class<? extends Log> implClass) {
12 try {
13 Constructor<? extends Log> candidate = implClass.getConstructor(String.class);
14 Log log = candidate.newInstance(LogFactory.class.getName());
15 if (log.isDebugEnabled()) {
16 log.debug("Logging initialized using '" + implClass + "' adapter.");
17 }
18 logConstructor = candidate;
19 } catch (Throwable t) {
20 throw new LogException("Error setting Log implementation. }

8. 组合模式

9. 迭代器模式

(未完待续)

最新文章

  1. .NET - 基于事件的异步模型
  2. [BZOJ1861][Zjoi2006]Book 书架
  3. liunx 远程拷贝到本地
  4. spring中各jar功能及jar包之间的依赖关系
  5. You should blog even if you have no readers
  6. CodeForces 7C Line
  7. Git push错误non-fast-forward后的冲突解决
  8. 手机时间选择插件 Jquery
  9. 如何让MyEclispe中英文切换
  10. Storm流计算从入门到精通之技术篇(高并发策略、批处理事务、Trident精解、运维监控、企业场景)
  11. speedbar , tabbar 还有linum-mode
  12. Kali Linux远程连接Windows服务器
  13. JavaScript如何正确处理Unicode编码问题!
  14. D - GCD HDU - 1695 -模板-莫比乌斯容斥
  15. [NOI 2017]蚯蚓排队
  16. npm 无法安装 ionic 解决办法
  17. python----流程控制
  18. Beta 冲刺 二
  19. 【转载】51单片机data,bdata,idata,xdata使用注意事项
  20. 21 包含min函数的栈

热门文章

  1. python中时间处理标准库DateTime加强版库:pendulum
  2. qsc oj-17 喵哈哈村的排队
  3. java线程day-01
  4. TP5 pc和wap跳转404
  5. windows 中cmd一些特殊命令
  6. typora+picgo+gitee 图片无法加载问题
  7. PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]
  8. Python3入门系列之-----看完这一篇文章我终于学会了类
  9. IceCream in Python
  10. Redis基础数据结构-基于2.8