设计模式之组合模式

74 阅读2分钟

一、概念

  • 组合模式(Composite Pattern):又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系
  • 组合模式依据树形结构来组合对象,用来表示部分以及整体层次
  • 组合模式使得用户单个对象和组合对象的访问具有一致性,即组合能让客户以一致的方式处理个别对象以及组合对象
  • 简化客户端操作,客户端只需要面对一致的对象而不用考虑整体部分或叶子节点问题
  • 具有较强的拓展性,当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动
  • 方便创建出复杂的层次结构,客户端不用理会组合里面的组成细节,容易添加节点或叶子从而创建出复杂的树形结构
  • 需要遍历组织机构、或者处理的对象具有树形结构时,非常适合使用组合模式
  • 要求较高的抽象性,如果叶子和节点有很大差异性的话,不适合使用组合模式
  • 组合模式的角色及职责:
    • Component:这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component子部件,Component可以是抽象类或者接口
    • Leaf:在组合中表示叶子节点,叶子节点没有 子节点
    • Composite:非叶子节点,用于存储子部件,在Component实现子部件的相关操作,比如增加(add),删除

二、组合模式解决学校院系展示的应用实例

在这里插入图片描述

public abstract class OrganizationComponent {
  private String name;
  private String desc;

  public OrganizationComponent() {
  }

  public OrganizationComponent(String name, String desc) {
    this.name = name;
    this.desc = desc;
  }

  public abstract void add(OrganizationComponent organizationComponent);

  public abstract void remove(OrganizationComponent organizationComponent);

  public abstract void print();

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getDesc() {
    return desc;
  }

  public void setDesc(String desc) {
    this.desc = desc;
  }
}
public class School extends OrganizationComponent {
  List<OrganizationComponent> colleges = new ArrayList<>();

  public School() {
  }

  public School(String name, String desc) {
    super(name, desc);
  }

  @Override
  public void add(OrganizationComponent organizationComponent) {
    colleges.add(organizationComponent);
  }

  @Override
  public void remove(OrganizationComponent organizationComponent) {
    colleges.remove(organizationComponent);
  }

  @Override
  public void print() {
    System.out.println(super.getName() + " " + super.getDesc());
    for (OrganizationComponent college : colleges) {
      college.print();
    }
  }
}
public class College extends OrganizationComponent {
  List<OrganizationComponent> departments = new ArrayList<>();

  public College() {
  }

  public College(String name, String desc) {
    super(name, desc);
  }

  @Override
  public void add(OrganizationComponent department) {
    departments.add(department);
  }

  @Override
  public void remove(OrganizationComponent department) {
    departments.remove(department);
  }

  @Override
  public void print() {
    System.out.println(super.getName() + " " + super.getDesc());
    for (OrganizationComponent department : departments) {
      department.print();
    }
  }
}
public class Department extends OrganizationComponent {
  public Department() {
  }

  public Department(String name, String desc) {
    super(name, desc);
  }

  @Override
  public void add(OrganizationComponent organizationComponent) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void remove(OrganizationComponent organizationComponent) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void print() {
    System.out.println(super.getName() + " " + super.getDesc());
  }
}