我们先看一下java.awt.container这么一个类,public class Container extends Component 我们可以看到这个类继承Component,awt这个包下边都是实现窗口菜单,属于编写C/S结构所使用的,我们可以通过行为方法进行识别,它是将相同的抽象类的类型,或者接口的类型,这种类型的实例转换为树状结构,他本身Container继承了Component,我们再看一下,他的add方法,public Component add(Component comp) {addImpl(comp, null, -1);return comp;
}他的add方法增加了一个Component,和我们是一样的,课程目录里面增加了一个自己的父类,这个就是通过行为方法来识别,同理我们来看一下java.util.HashMap,HashMap大家都很熟悉,public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {他呢实现了Map接口,同时我们再看一下他的putAll方法,public void putAll(Map<? extends K, ? extends V> m) {putMapEntries(m, true);
}putAll这个方法里面放的参数呢,也是一个Map,这里也是组合模式的一个应用,同理我们再看一下大家非常熟悉的,java.util下的List,我们直接看实现ArrayList,public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable同理他也是实现了List接口,然后看一下addAll这个方法,public boolean addAll(Collection<? extends E> c) {Object[] a = c.toArray();int numNew = a.length;ensureCapacityInternal(size + numNew);  // Increments modCountSystem.arraycopy(a, 0, elementData, size, numNew);size += numNew;return numNew != 0;
}addAll里面直接添加了一个Collection,和Collection是什么关系呢,他实现了List接口,我们进来public interface List<E> extends Collection<E> List接口又继承了Collection接口,所以ArrayList里面的addAll,这个方法也正是组合模式的一个应用,那set也是同理,那JDK讲完了,我们再看一下在Mybatis当中,有什么应用呢,我们看一个类,叫sqlnode,通过这个名字,就可以看出来,这个就代表一个SQL节点,我们看一下,package org.apache.ibatis.scripting.xmltags;/*** @author Clinton Begin*/
public interface SqlNode {boolean apply(DynamicContext context);
}组合模式就是把多个对象,组合成一个对象,简化对多个对象的访问,对于Mybatis的MYSQL,一条SQL可以被解析成多个SQLNODE对象,SqlNode对象,有什么实现呢,我们Ctrl + T看一下,这里面有很多,我们使用了很多Mybatis的SQL,无论是集合的遍历,还是where语句的一个拼装,其实使用的都是SqlNode的这么一个父类,只不过对于Mybatis而言,各种SQL都会解析成不同的SqlNode对象,他们都属于同一个类型的对象,都实现了SqlNode接口,所以他们都是SqlNode对象,多个SqlNode怎么结合到一块呢,我们看一下MixedSqlNode,这个就是他们的核心,这个就相当于我们coding实战当中的课程目录,课程目录里面有很多课程,和这个是同理,我们可以看到他实现了SqlNode这个接口public class MixedSqlNode implements SqlNode {private List<SqlNode> contents;public MixedSqlNode(List<SqlNode> contents) {this.contents = contents;}@Overridepublic boolean apply(DynamicContext context) {for (SqlNode sqlNode : contents) {sqlNode.apply(context);}return true;}
}同时里面还包含了多个SqlNode,这个就是CourseCatalog是一模一样的,CourseCatalog他继承了抽象类CatalogComponent,只不过我们使用的是抽象类,而Mybatis使用的是接口,然后里面的items,相当于MixedSqlNode的contents,然后下边的apply也是循环遍历,然后挨个进行apply,把上下文再传进来,那这个apply和我们现在的print方法,是异曲同工的,通过这么一个类比,相信这一块一定会理解更深入的,那我们接着回来,所以我们在使用组合模式的时候,最关键的一点是什么呢,就是叶子对象,和组合对象,都要实现相同的接口,或者继承相同的抽象类,他们之间是要有这种关系的,只有达到这样的关系,组合模式才能将叶子节点对象,还有组合好的对象,这种节点进行一致的处理,那我们再来看一下,其他的实现比如WhereSqlNode,public class WhereSqlNode extends TrimSqlNode {private static List<String> prefixList = Arrays.asList("AND ","OR ","AND\n", "OR\n", "AND\r", "OR\r", "AND\t","OR\t");public WhereSqlNode(Configuration configuration, SqlNode contents) {super(configuration, contents, "WHERE", prefixList, null, null);}}可以看到这里面有一些他的实现,比如他的前缀list,包括AND,OR,还有带\n的AND,OR,还有带\r的,还有带\t的,他的构造器就调用父类的构造器,然后把这些条件传进来,比如prefix直接写了一个"WHERE",父类就是调用TrimSqlNode,我们点进来public TrimSqlNode(Configuration configuration, SqlNode contents, String prefix, String prefixesToOverride, String suffix, String suffixesToOverride) {this(configuration, contents, prefix, parseOverrides(prefixesToOverride), suffix, parseOverrides(suffixesToOverride));}他直接调用了这个构造器,这个构造器又调用了this,我们进来看一下protected TrimSqlNode(Configuration configuration, SqlNode contents, String prefix, List<String> prefixesToOverride, String suffix, List<String> suffixesToOverride) {this.contents = contents;this.prefix = prefix;this.prefixesToOverride = prefixesToOverride;this.suffix = suffix;this.suffixesToOverride = suffixesToOverride;this.configuration = configuration;}this就把这些值赋值上apply的时候进行使用@Overridepublic boolean apply(DynamicContext context) {FilteredDynamicContext filteredDynamicContext = new FilteredDynamicContext(context);boolean result = contents.apply(filteredDynamicContext);filteredDynamicContext.applyAll();return result;}所以对于SqlNode这么一个接口,可以说是开源框架中对于组合模式描述非常清晰的一个开源框架源码,希望你们如果有时间,来看一下,SqlNode其他节点的具体实现,那我们可以通过UML看源码的,可以快速的对你关心的源码结构有所了解,我们可以右键点开show implementation,show实现,这里面都是实现这个接口的类,我们直接按Ctrl + T挨个选一下,平时呢我也是使用这种办法,来学习一些源码,现在这个类比较多

这里刚好放满一屏,局部放大,SetSqlNode继承了TrimSqlNode,然后上面的都实现了SqlNode接口,然后我们打开他们的关系可以看一下,有些类是组合关系,有些类并不是组合关系,那我们可以对这些有差异的类,还有这些字段属性,方法名字,都打开之后,我们来看一下,那现在字体非常非常小,我们可以通过这种方式,来对整个SqlNode的实现呢,一目了然,因为我们学习了UML,来看这些图还是很方便的,这个也是一个非常好的办法,来学习源码,希望你们能够学习这个技能,那组合模式在我们日常开发工作中,一定要注意我们coding过程中,碰到的那几个坑,还有刚才讲到的要有统一的接口实现,或者统一的抽象父类

组合模式源码解析(jdk+mybatis)相关推荐

  1. 迭代器模式源码解析(jdk+mybatis)

    自己实现的数据结构,迭代器在源码中的一些应用,java.util.Iterator接口,/*** An iterator over a collection. {@code Iterator} tak ...

  2. 装饰者模式源码解析(spring-session mybatis jdk servlet)

    那在JDK中体现最明显的,就是JAVA IO方面的一些类,那在JAVA IO中,我们为了增加缓存,我们使用BufferedReader,那现在我们来看一下,那因为增加缓存的功能,类有很多,子类也就需要 ...

  3. 代理模式源码解析(jdk+spring+mybatis)

    首先是java.lang.reflect,也就是我们刚刚使用的Proxy这个类,这里面coding的时候,也就是debug的时候,这个就是代理的一个典型应用,还有proxyFactoryBean,这个 ...

  4. 桥接模式源码解析(jdk)

    现在我们来看一下桥接模式在源码中的一些应用,首先我们说一下,我们先看一个接口,首先我们看一下Driver的实现类,我们看到com.mysql.jdbc实现了Driver,添加了ORACLE的驱动,或者 ...

  5. 享元模式源码解析(jdk+tomcat)

    首先我们看一下Integer这个类,在使用它的时候非常非常的频繁,那我们看一下Integer有一个方法,叫valueOfpublic final class Integer extends Numbe ...

  6. 美团Leaf源码——号段模式源码解析

    前言 分布式ID生成策略基本要求就是全局不重复,最好还能递增,长度较短,性能高,可用性强.关于相关的实现方案有很多,本文着重使用美团开源的分布式ID生成解决方案--Leaf. 关于Leaf,美团官方的 ...

  7. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  8. MyBatis3源码解析(8)MyBatis与Spring的结合

    简介 在上几篇文章中,解析了MyBatis的核心原理部分,我们大致对其有了一定的了解,接下来我们看看在日常的开发中MyBatis是如何与Spring框架结合的 源码解析 在我们的日常开发中,使用Spr ...

  9. Spark内核(上)——附:两种Yarn模式源码解析

    文章目录 一.Spark内核概述 1.1 Spark核心组件回顾 1.1.1 Driver 1.1.2 Executor 1.2 Spark通用运行流程概述 二.Spark通信架构概述 2.1 Spa ...

最新文章

  1. python 自动补全函数括号_Python学习笔记(二)
  2. 搞定高并发,岂能不懂Synchronized底层原理?
  3. Linux之移动复制和删除
  4. 使用Spring AOP,自定义注释和反射为您的应用审核基础架构
  5. BZOJ 2660 (BJOI 2012) 最多的方案
  6. Eclipse基础--java环境变量设置
  7. 【转】js如何准确获取当前页面url网址信息
  8. 计算机网络技术提纲,计算机网络技术复习提纲
  9. html 卫星地图显示地名,卫星图看:河南10个名字非常好听的县(区),你认识几个?...
  10. 税务会计实务【15】
  11. Windows 下利用cWrsync同步
  12. oracle中的dbf是什么文件,ORACLE数据库 DBF数据恢复-dbf是什么文件
  13. 对校招生培养工作的建议_贵单位对我校学生培养工作有何建议
  14. 不可思议:99%的人不了解的真实中国历史
  15. 【Kubernetes】Kubeadm安装的K8s集群的版本升级过程测试(二)
  16. 神经网络:AlexNet
  17. isee 处理图片的好工具
  18. 武林秘籍之C语言大法.第二式 语句 带你走向武林之巅
  19. access 组合框模糊筛选
  20. (期末考试prepare)放大电路静态工作点及微变等效电路问题实例求解

热门文章

  1. 大型网站典型故障案例分析
  2. 通向架构师的道路(第五天)之tomcat集群-群猫乱舞
  3. 如何判断京东达人文章是否下线
  4. 接口自动化测试之PHPUnit-框架代码编写2
  5. lvs主从服务器转发风暴(广播风暴、大流量)
  6. JavaScript强化教程——JavaScript Math(算数) 对象
  7. Unity网格合并_材质合并
  8. solaris 常用软件安装
  9. 创建 Robotium 测试工程
  10. Linux下运行jar程序