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

简介

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

UML图:

应用场景

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

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

  1. 根结点:总公司
java 复制代码
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. 节点:分公司,具有总公司的所有属性
java 复制代码
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. 叶子节点:部门
java 复制代码
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. 运行
java 复制代码
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);
    }
}
总结
  • 优点
    • 客户端只需要面对一致的对象无需考虑整体部分的问题
    • 方便创建复杂的层次结构
  • 缺点
    • 客户端需耗费较多时间梳理类之间的层次关系
相关推荐
晨米酱10 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机15 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机16 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机16 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤16 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式