大话设计模式——12.组合模式(Composite Pattern)

简介

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

UML图:
在这里插入图片描述

应用场景

  • 银行总行-分行
  • 总公司-分公司
  • 文件夹-文件
  • 要处理的对象可以生成一颗树形结构,对树上的节点和叶子进行操作时,能够提供一致的方式
示例

总公司、分公司、部门关系

  1. 根结点:总公司
public abstract class Company {


    protected String name;

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

    /**
     * 添加公司
     *
     * @param company
     */
    public abstract void add(Company company);

    /**
     * 删除公司
     *
     * @param company
     */
    public abstract void remove(Company company);


    /**
     * 展示公司
     *
     * @param depth
     */
    public abstract void display(int depth);
}
  1. 节点:分公司,具有总公司的所有属性
public class ConcretCompany extends Company {

    List<Company> companies = new ArrayList<>();

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

    @Override
    public void add(Company company) {
        companies.add(company);
    }

    @Override
    public void remove(Company company) {
        companies.remove(company);
    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }

        System.out.println(sb + this.name);

        for (Company company : companies) {
            // 分级
            company.display(depth + 2);
        }
    }
}
  1. 叶子节点:部门
public class Department extends Company {


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

    @Override
    public void add(Company company) {

    }

    @Override
    public void remove(Company company) {

    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }

        System.out.println(sb + this.name);
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {
        Company company = new ConcretCompany("总公司");
        Company department01 = new Department("人事部门");
        Company department02 = new Department("数字部门");
        company.add(department01);
        company.add(department02);

        Company company1 = new ConcretCompany("分公司01");
        Company department03 = new Department("分公司01的数字部门");
        company1.add(department03);
        Company company2 = new ConcretCompany("分公司02");
        Company department04 = new Department("分公司02的数字部门");
        company2.add(department04);

        company.add(company1);
        company.add(company2);

        // 总公司架构
        company.display(0);
    }
}

在这里插入图片描述

总结
  • 优点
    • 客户端只需要面对一致的对象无需考虑整体部分的问题
    • 方便创建复杂的层次结构
  • 缺点
    • 客户端需耗费较多时间梳理类之间的层次关系

相关推荐

  1. 大话设计模式组合模式

    2024-04-09 23:44:01       13 阅读
  2. 笨蛋学设计模式结构型模式-组合模式12

    2024-04-09 23:44:01       28 阅读
  3. 设计模式10、composite 组合模式

    2024-04-09 23:44:01       13 阅读
  4. 设计模式——组合模式

    2024-04-09 23:44:01       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 23:44:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 23:44:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 23:44:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 23:44:01       20 阅读

热门阅读

  1. vue3基础: 组件注册

    2024-04-09 23:44:01       12 阅读
  2. 微信小程序第六次课(模块化和绑定事件)

    2024-04-09 23:44:01       14 阅读
  3. 题目 2915: 接水问题

    2024-04-09 23:44:01       18 阅读
  4. GDB调试概述

    2024-04-09 23:44:01       13 阅读
  5. 题目 2016: 新生的入队仪式

    2024-04-09 23:44:01       13 阅读
  6. 三月已过,春招进度堪忧

    2024-04-09 23:44:01       14 阅读
  7. 并查集(基础+带权以及可撤销并查集后期更新)

    2024-04-09 23:44:01       14 阅读
  8. Linux 内核同步

    2024-04-09 23:44:01       15 阅读