深度学习设计模式之组合模式

文章目录


前言

组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。


一、介绍

组合设计模式又叫部分整体模式,将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。使用户可以通过一致的方法操作单个对象或组合对象,整体和部分的基本操作多数都是一样的,也会有不同的地方。组合模式可以用一棵树来表示。

二、详细分析

1.核心组成

  • 组合部件(Component):它是一个抽象接口,表示树根;
  • 合成部件(Composite):和组合部件类似,也有自己的子节点;
  • 叶子(Leaf):在组合中表示子节点对象,注意他是没有子节点。
    公司底下有部门,部门底下有职位。以下所示:

2.实现步骤

  1. 创建组合部件,他是个抽象类,定义部件中的属性和方法;
  2. 创建合成部件,继承组合部件,创建集合属性,用来管理叶子节点;
  3. 创建叶子节点,继承组合部件,不能添加子节点。

3.代码示例

组合部件

复制代码
/**
 * 组合部件
 */
public abstract class Company {

    private String job;

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

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }


    /**
     * 添加职位
     */
    protected abstract void addJob(Company company);

    /**
     * 删除职位
     */
    protected abstract void removeJob(Company company);

    /**
     * 展示职位
     * @param depth 显示层级
     */
    protected abstract void display(int depth);

}

合成部件

复制代码
/**
 * 合成部件
 */
public class Department extends Company {

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

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

    @Override
    protected void addJob(Company company) {
        companyList.add(company);
    }

    @Override
    protected void removeJob(Company company) {
        companyList.remove(company);
    }

    @Override
    protected void display(int depth) {
        StringBuffer str= new StringBuffer();
        for (int i=0;i<depth;i++){
            str.append("-");
        }
        // 输出
        System.out.println(str.toString()+this.getJob());
        //子层级再加2
        for (Company company:companyList){
            company.display(depth+2);
        }

    }

}

叶子节点

复制代码
/**
 * 叶子节点
 */
public class Job extends Company{

    public Job(String job) {
        super(job);
    }

    @Override
    protected void addJob(Company company) {
    }

    @Override
    protected void removeJob(Company company) {
    }

    @Override
    protected void display(int depth) {
        StringBuffer str= new StringBuffer();
        for (int i=0;i<depth;i++){
            str.append("-");
        }
        // 输出
        System.out.println(str.toString()+this.getJob());
    }
}

测试类:

复制代码
    public static void main(String[] args) {
        // 创建根
        Company company = new Department("北京公司");
        // 创建部门节点
        Company dept = new Department("软件开发部门");
        Company dept2 = new Department("软件测试部门");
        Company dept3 = new Department("产品部门");
        // 创建叶子节点并添加至部门
        Company job= new Job("软件开发经理");
        Company job1 = new Job("软件开发工程师");
        dept.addJob(job);
        dept.addJob(job1);

        Company job2 = new Job("软件测试工程师");
        dept2.addJob(job2);

        Company job3 = new Job("产品经理");
        dept3.addJob(job3);

        company.addJob(dept);
        company.addJob(dept2);
        company.addJob(dept3);

        company.display(0);

    }

结果

4.优缺点

优点

  • 组合模式定义了一组统一的接口,可以用来处理单个对象和组合对象,从而简化了客户端代码;
  • 组合模式使得可以很自然地将对象和它们的行为组织在一起,提高了代码的内聚性;
  • 新增加的叶节点类型或树枝节点类型可以无缝集成到现有系统中,无需修改现有代码;
  • 组合模式使得对象的添加和删除变得容易,因为它们可以统一地被添加到树形结构中。

缺点

  • 客户端需要花更更多时间理理清类之间的层次关系;
  • 组合模式要求所有叶子节点和树枝节点都实现相同的接口,这可能限制了对象的灵活性。

5.使用场景

  • 当想表达对象的部分-整体的层次结构,比如公司结构、菜单、文件夹等等;
  • 当我们的要处理的对象可以生成一颗树形结构,我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子。

总结

以上就是本篇的内容,本文简单介绍了组合模式的组成、优缺点、使用场景等,提供了代码示例。

相关推荐
饕餮争锋7 小时前
设计模式笔记_行为型_观察者模式
笔记·观察者模式·设计模式
我命由我1234510 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
long31610 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
汤姆大聪明11 小时前
【软件设计模式】前置知识类图、七大原则(精简笔记版)
笔记·设计模式
饕餮争锋15 小时前
设计模式笔记_行为型_策略模式
笔记·设计模式·策略模式
易元15 小时前
模式组合应用-桥接模式(一)
后端·设计模式
是2的10次方啊15 小时前
🕺 行为型设计模式:对象协作的舞蹈家(中)
设计模式
the sun3416 小时前
常见的设计模式(2)单例模式
单例模式·设计模式
是2的10次方啊16 小时前
🕺 行为型设计模式:对象协作的舞蹈家(上)
设计模式
一乐小哥19 小时前
从面试高频到实战落地:单例模式全解析(含 6 种实现 + 避坑指南)
java·设计模式