第四篇 生成对象树 第十三章 - 组合模式

  接下来的两个章节为您介绍树形结构。
  树形结构很常见,文件目录和系统菜单是典型的树形结构。自然界中的树形结构更多,这里“树木丛生,百草丰茂。”
  我们关注的树形结构主要是“树形对象结构”,也称“对象树”,它描述了对象之间的分支和层次关系。
  组合模式常被用来生成对象树。
  下面模拟玉米的“茎—苞—须”三级结构,看看组合模式的写法。

// 抽象元素
public abstract class Component {

  private Component parent;// 父元素

  public abstract void show();

  public Component getParent() {
    return parent;
  }

  public void setParent(Component parent) {
    this.parent = parent;
  }

}

// 复合元素(茎、苞)
public class Composite extends Component {

  // 子元素列表
  java.util.List<Component> list = new java.util.ArrayList<>();

  // 添加子元素
  public boolean add(Component obj) {
    obj.setParent(this);
    return list.add(obj);
  }

  // 获取子元素
  public java.util.List<Component> getChildren() {
    return this.list;
  }

  @Override
  public void show() {
    // 苗心别出一苞。
  }

}

// 末端元素(须)
public class Terminal extends Component {

  @Override
  public void show() {
    // 苞上出白丝垂垂。
  }

}

// 测试类
public class Test {

  public void test() {
    // 生成树形对象结构
    Composite plant = new Composite();// 茎
    Composite cob = new Composite();// 苞
    Terminal silk1 = new Terminal();// 须
    Terminal silk2 = new Terminal();// 须
    plant.add(cob);
    cob.add(silk1);
    cob.add(silk2);
    // 遍历树中对象
    show(plant);
  }

   // 递归遍历树中对象
  public void show(Composite obj) {
    for (Component child : obj.getChildren()) {
      if (child instanceof Terminal) {
        child.show();
      } else {
        show((Composite) child);
      }
    }
  }

}

  这里将对象树的组成元素分成了“复合元素”和“末端元素”两种类型。
  复合元素(如茎、苞)均包含下级元素,除了位于树根部的元素(如茎)外,其他复合元素都有上级元素;末端元素(如须)只有上级元素,没有下级元素。
  新增对象时只需“二选一”将其定型为复合元素或末端元素,就可以方便地把它加到树中。
  此例生成的对象树如图所示。
  

posted on 2025-03-28 19:34  星辰河岳  阅读(33)  评论(0)    收藏  举报