组合模式的作用:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

 案例一JDK 的 AWT(Abstract Window Toolkit),使用了组合模式。AWT 中包含了两种组件:容器组件和基本组件。

  • 容器组件是 java.awt.Container 的子孙类
  • 基本组件是 java.awt.Component 的子孙类
  • 容器组件和基本组件都是 java.awt.Component 的子孙类


Container 类中可以包含基本组件或容器,放在 ArrayList 中

public class Container extends Component {    private java.util.List<Component> component = new ArrayList<>();     //向容器类中添加基本组件或容器    public Component add(Component comp) {        addImpl(comp, null, -1);        return comp;    }}

基本组件与容器组件,构成了树状结构。由于都是 Component 的子孙类,对 Component 定义的方法,访问上具有一致性。 

案例二

Mybatis 在处理 xml 动态 sql 中用到了组合模式。

  • 抽象构建接口 SqlNode,定义了 apply 方法,根据传入参数构造 sql 片段

public interface SqlNode {  boolean apply(DynamicContext context);}
  • 容器类 MixedSqlNode、ChooseSqlNode 实现 SqlNode 接口,List 存储  SqlNode

public class MixedSqlNode implements SqlNode {  private List<SqlNode> contents;
 public MixedSqlNode(List<SqlNode> contents) {    this.contents = contents;  }
 @Override  public boolean apply(DynamicContext context) {    for (SqlNode sqlNode : contents) {      sqlNode.apply(context);    }    return true;  }}
public class ChooseSqlNode implements SqlNode {  private SqlNode defaultSqlNode;  private List<SqlNode> ifSqlNodes;
 public ChooseSqlNode(List<SqlNode> ifSqlNodes, SqlNode defaultSqlNode) {    this.ifSqlNodes = ifSqlNodes;    this.defaultSqlNode = defaultSqlNode;  }
 @Override  public boolean apply(DynamicContext context) {    for (SqlNode sqlNode : ifSqlNodes) {      if (sqlNode.apply(context)) {        return true;      }    }    if (defaultSqlNode != null) {      defaultSqlNode.apply(context);      return true;    }    return false;  }}
  • 其他叶子节点:TextSqlNode、StaticTextSqlNode、TrimSqlNode、SetSqlNode、WhereSqlNode ... 均是通过 apply 方法构建 SQL 片段

 SqlNode 的实现类通过容器类与叶子节点构造成树形结构,使用 apply 动态解析出 SQL 片段并追加到 DynamicContext.sqlBuilder,解析完所有的 SqlNode 生成完整 SQL。 apply 方法具有访问一致性。 图片↓↓  查看脑图


更多相关文章

  1. 几款代码高亮组件的体验,说不定你以后会用到
  2. JDK 中有哪些同步容器?并发容器?
  3. CopyOnWriteArrayList,一个面试中经常问到的冷门容器
  4. 解读容器的 2020:寻找云原生的下一站
  5. 谷歌助力,快速实现 Java 应用容器化
  6. JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互
  7. JavaScript测试教程-part 2:引入 Enzyme 并测试 React 组件[每日
  8. 011. 盛最多水的容器 | Leetcode题解
  9. 认识DHTML中的“行为”组件

随机推荐

  1. 使用Java发出DNS请求并对响应进行计时
  2. java学习笔记1
  3. 在使用visualvm进行分析时,如何避免“Prof
  4. Spring SpEL系列二 @Value,xml, Java代码
  5. java必备——网络编程初解
  6. 蓝桥杯--第七届决赛:路径之谜
  7. 异步执行多个任务并在JavaScript函数中返
  8. Java-控制台传递参数
  9. 怎样让自己对编程感兴趣?
  10. 数据结构-java与c实现带头结点的单链表