《大话设计模式》读书笔记 - 组合模式

1、组合模式定义

将对象组合成树形结构以表示 ‘部分-整体’ 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

2、组合模式模型图

《大话设计模式》读书笔记 - 组合模式_第1张图片

3、组合模式应用

  • 表示对象的 ”部分-整体“ 的层次结构(树形结构)。例如:公司的组织架构图,总公司下面有区域办事处,区域办事处下面有各个省市的子公司;文件和文件夹的管理;树形菜单;
  • 希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象

4、代码案例

需要解决的问题:
《大话设计模式》读书笔记 - 组合模式_第2张图片
这是公司的组织架构,用组合设计模式的思想,清晰的表达出整体的结构

抽象类 Company

public abstract class Company {

  protected String name;

  public Company(String name) {
    this.name = name;
  }

  /**
   * 增加
   */
  abstract void add(Company company);

  /**
   * 移除
   */
  abstract void remove(Company company);

  /**
   * 打印
   */
  abstract void display(int depth);

}

代表公司的类 ConcreteCompany

public class ConcreteCompany extends Company {

  private List<Company> childCompanys = new ArrayList<Company>();

  public ConcreteCompany(String name) {
    super(name);
  }

  void add(Company company) {
    childCompanys.add(company);

  }

  void remove(Company company) {
    childCompanys.remove(company);
  }

  void display(int depth) {
    for (int i = 0; i < depth; i++) {
      System.out.print("-");
    }
    System.out.println(name);
    childCompanys.forEach(company -> company.display(depth + 2));
  }

}

代表公司下的部分类 Department

public class Department extends Company {

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

  @Override
  void add(Company company) {

  }

  @Override
  void remove(Company company) {

  }

  @Override
  void display(int depth) {
    for (int i = 0; i < depth; i++) {
      System.out.print("-");
    }
    System.out.println(name);

  }
}

测试客户端 CompanyClient

public class CompanyClient {

  public static void main(String[] args) {
    ConcreteCompany root = new ConcreteCompany("北京总公司");
    root.add(new Department("总公司人力资源部"));
    root.add(new Department("总公司人力财务部"));

    ConcreteCompany huadong = new ConcreteCompany("上海华东分公司");
    huadong.add(new Department("华东分公司人力资源部"));
    huadong.add(new Department("华东分公司人力财务部"));
    root.add(huadong);

    ConcreteCompany nanjing = new ConcreteCompany("南京办事处");
    nanjing.add(new Department("南京办事处人力资源部"));
    nanjing.add(new Department("南京办事处人力财务部"));
    huadong.add(nanjing);

    ConcreteCompany suzhou = new ConcreteCompany("苏州办事处");
    suzhou.add(new Department("苏州办事处人力资源部"));
    suzhou.add(new Department("苏州办事处人力财务部"));
    huadong.add(suzhou);

    System.out.println("=======组织结构图=======");
    root.display(1);

  }

}

结果:

=======组织结构图=======
-北京总公司
---总公司人力资源部
---总公司人力财务部
---上海华东分公司
-----华东分公司人力资源部
-----华东分公司人力财务部
-----南京办事处
-------南京办事处人力资源部
-------南京办事处人力财务部
-----苏州办事处
-------苏州办事处人力资源部
-------苏州办事处人力财务部

5、组合模式总结

使用组合设计模式模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

你可能感兴趣的:(Java)