组合模式定义与类型
定义
将对象组合成树形结构以表示 “部分-整体” 的层次结构
组合模式使客户端对单个对象和组合对象保持一致的方式处理
类型:结构型
适用场景
希望客户端可以忽略组合对象与单个对象的差异时
处理一个树形结构时
优点
清楚地定义分层次的复杂对象,表示对象的全部或部分层次
让客户端忽略了层次的差异,方便对整个层次结构进行控制
简化客户端代码
符合开闭原则
缺点
限制类型时会较为复杂
使设计模式变得更加抽象
类图
组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。
组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。

在源码中的使用
mybatis的SqlNode
mybatis的SqlNode(SqlNode是mybatis动态SQL功能的重要组成部分)
例如下面这段sql中,<if></if>标签所包含的内容则是mybatis动态sql功能最基本的体现,他能实现如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
mybatis提供的动态sql类型有:
- if
- choose
- when
- otherwise
- trim
- where
- set
- foreach
- script
- bind
SqlSource和SqlNode的关系
文章开始之前需要搞明白代码中的SqlSource和SqlNode分别是什么,以及他们的关系是什么。这两个关系搞不清的话,看代码就会比较懵逼。

他们的关系如上图所示,SqlSource和SqlNode的关系是一对多的关系。
SqlNode
如上所述,SqlNode是动态sql配置在程序中的组织形式,每个 XML Node 会解析成对应的 SqlNode 对象。其类图如下

SqlNode的各个实现类使用了组合设计模式,mybatis通过使用组合设计模式帮助上层调用者屏蔽了对象的复杂性,也使得如果后续需要添加新的SqlNode类型的话,会变得非常容易,符合开闭原则。
SqlNode的数据结构
SqlNode的数据结构很像一个树结构,MixedSqlNode节点为树枝,其余类型为树叶。其结构大致如下:

关于mybatis sqlNode的详细内容解析可以查看这篇博客mybatis源码学习------动态sql的解析(SqlNode)_A股慈善家的博客-CSDN博客
本文介绍了组合模式在Mybatis框架中的SqlNode中的应用,展示了如何通过树形结构清晰表示对象层次,以及如何利用组合设计模式简化客户端代码,同时讨论了SqlSource和SqlNode的关系以及它们在动态SQL配置中的作用。

被折叠的 条评论
为什么被折叠?



