知乎 上海做网站的公司,如何快速的建设网站,商业网站的设计与推广系统,企点官网下载MyBatis源码用了哪些设计模式#xff1f;前言一、创建型模式工厂模式单例模式建造者模式二、结构型模式适配器模式代理模式组合模式装饰器模式三、行为型模式模板模式策略模式迭代器模式总结前言
在 MyBatis 的两万多行的框架源码中#xff0c;使用了大量的设计模式对工程架…
MyBatis源码用了哪些设计模式前言一、创建型模式工厂模式单例模式建造者模式二、结构型模式适配器模式代理模式组合模式装饰器模式三、行为型模式模板模式策略模式迭代器模式总结前言
在 MyBatis 的两万多行的框架源码中使用了大量的设计模式对工程架构中的复杂场景进行解耦这些设计模式的巧妙使用是整个框架的精华。
一、创建型模式
工厂模式
工厂模式简单工厂是一种创建型模式在父类中提供一个创建对象的方法允许子类决定实例对象的类型。
SqlSessionFactory 的结构如图所示。 场景介绍SqlSessionFactory 是获取会话的工厂每次使用MyBatis 操作数据库时 都会开启一个新的会话。在会话工厂的实现中SqlSessionFactory 负责获取数据源环境配置信息、构建事务工厂和创建操作SQL 的执行器最终返回会话实现类。
同类设计
SqlSessionFactoryObjectFactoryMapperProxyFactoryDataSourceFactory
单例模式
Configuration 单例配置类的结构如图所示。 单例模式是一种创建型模式能够保证一个类只有一个实例并且提供一个访问该实例的全局节点。
场景介绍Configuration 是一个大单例贯穿整个会话周期所有的配置对象如映射、缓存、入参、出参、拦截器、注册机和对象工厂等都在Configuration 配置项中初始化 并且随着SqlSessionFactoryBuilder 构建阶段完成实例化操作。
同类场景
ErrorContextLogFactoryConfiguration
建造者模式
ResultMap 建造者模式的结构如图所示。 建造者模式使用多个简单的对象一步一步地构建成一个复杂的对象提供了一种创建对象的最佳方式。
场景介绍建造者模式在MyBatis 中使用了大量的XxxxBuilder将XML 文件解析到各类对象的封装中使用建造者及建造者助手完成对象的封装。它的核心目的是不希望把过多的关于对象的属性设置写到其他业务流程中而是用建造者方式提供最佳的边界隔离。
同类场景
SqlSessionFactoryBuilderXMLConfigBuilderXMLMapperBuilderXMLStatementBuilderCacheBuilder
二、结构型模式
适配器模式
日志实现类的结构如图所示。 适配器模式是一种结构型模式能使接口不兼容的对象也可以相互合作。
场景介绍正是因为有太多的日志框架包括Log4j、Log4j2 和Slf4J 等而这些日志框架的使用接口又各有差异为了统一这些日志框架的接口MyBatis 定义了一套统一的接口为所有的其他日志框架的接口做相应的适配。
同类场景主要集中在对Log 日志的适配上。
代理模式
代理模式的实现结构如图所示。 代理模式是一种结构型模式能够提供对象的替代品或占位符。代理控制元对象的访问并且允许在将请求提交给对象前进行一些处理。
场景介绍没有代理模式就不存在各类框架。就像MyBatis 中的MapperProxy 实现类 代理工厂实现的功能就是完成DAO 接口的具体实现类的方法配置的任何一个DAO 接口调用的CRUD 方法都会被MapperProxy 接管调用到方法执行器等并返回最终的数据库执行结果。
同类场景
DriverProxyPluginInvokerMapperProxy
组合模式
解析节点类的结构如图所示。 组合模式是一种结构型模式可以将对象组合成树形结构以表示“部分—整体” 的层次结构。
场景介绍在MyBatis XML 动态的SQL 配置中共提供了9 种标签trim、where、set、foreach、if、choose、when、otherwise 和bind使用者可以组合出各类场景的SQL 语句。而SqlNode 接口的实现就是每个组合结构中的规则节点通过规则节点的组装完成规则树组合模式的使用。
同类场景主要体现在对各类SQL 标签的解析上以实现SqlNode 接口的各个子类为主。
装饰器模式
二级缓存装饰器的实现结构如图所示。 装饰器模式是一种结构型设计模式允许将对象放入包含行为的特殊封装对象中 为元对象绑定新的行为。
场景介绍MyBatis 的所有SQL 操作都是经过SqlSession 调用SimpleExecutor 完成的 而一级缓存的操作也是在简单执行器中处理的。这里的二级缓存因为是基于一级缓存刷新的所以在实现上通过创建一个缓存执行器包装简单执行器的处理逻辑实现二级缓存操作。这里用到的就是装饰器模式也叫俄罗斯套娃模式。
三、行为型模式
模板模式
SQL 执行模板模式如图所示。 模板模式是一种行为型模式在超类中定义了一个算法的框架允许子类在不修改结构的情况下重写算法的特定步骤。场景介绍存在一系列可被标准定义的流程并且流程的步骤大部分采用通用逻辑只有一小部分是需要子类实现的通常采用模板模式来定义这个标准的流程。就像MyBatis 的BaseExecutor 就是一个用于定义模板模式的抽象类在这个类中把查询、修改的操作都定义为一套标准的流程。
同类场景
BaseExecutorSimpleExecutorBaseTypeHandler
策略模式
多类型处理器策略模式的结构如图所示。 策略模式是一种行为型模式能定义一系列算法并将每种算法分别放入独立的类中从而使算法的对象能够互相替换。
场景介绍在MyBatis 处理JDBC 执行后返回的结果时需要按照不同的类型获取对应的值这样就可以避免大量的if 判断。所以这里基于TypeHandler 接口对每个参数类型分别做了自己的策略实现。
同类场景
PooledDataSourceUnpooledDataSourceBatchExecutorResuseExecutorSimpleExectorCachingExecutorLongTypeHandlerStringTypeHandlerDateTypeHandler
迭代器模式
拆解字段解析实现的结构如图所示。 迭代器模式是一种行为模式能在不暴露集合底层表现形式的情况下遍历集合中的所有元素。
场景介绍PropertyTokenizer 用于MyBatis 的MetaObject 反射工具包下用来解析对象关系的迭代操作。这个类在MyBatis 中使用得非常频繁包括解析数据源配置信息并填充到数据源类上同时参数的解析、对象的设置都会使用这个类。
同类场景PropertyTokenizer。
总结
通过梳理MyBatis大约运用了10种左右设计模式。可以说复杂且优秀的ORM 框架源码在设计和实现的过程中都会使用大量的设计模式。
在解决复杂场景的问题时需要采用分治、抽象的方法运用设计模式和设计原则等相关知识把问题合理切割为若干子问题以便加以理解和解决。