设计模式-结构型模式-组合模式

概述

组合模式 : Composite Pattern : 是一种结构型设计模式。
**它允许你将对象组合成树形结构来表示"部分-整体"的层次结构。**
核心思想:

单个对象组合对象 实现相同的接口,这样就可以在不区分是单个对象还是组合对象的情况下,以相同的方式处理它们。

这极大地简化了客户端代码,并且能够构建出复杂的层次结构。
使用场景:

实际上,当需要用到 树形结构的时候,就可以使用此模式。

例如 : 文件的目录结构,有文件夹和文件 两个类型,文件夹包含文件列表,这就可以是一个树形的结构。

核心组件

Component(组件):这是组合中的抽象基类或接口 ,声明了所有共有方法,包括操作自身的方法以及操作子部件的方法。
Leaf(叶子节点): 表示没有子部件的组件。Leaf 类实现了 Component 中定义的所有操作,通常情况下 Leaf 不会实现任何操 作子部件的方法,因为它没有子部件。
Composite(组合): 代表包含子部件的组件。Composite 类不仅实现了 Component 中定义的操作,还维护了一个子部件的列表,并实现了相关的管理子部件的方法,如添加、删除或访问子部件等。

案例

案例描述

文件系统中,有 文件夹 和 文件两种类型。

文件夹中包含文件,有 添加、删除、展示文件列表的功能,这就是一个 【Composite 组合对象】;

文件就是 一个叶子节点【Leaf节点】。

类图

案例代码

接口

java 复制代码
public interface FileSystemComponent {

    // 添加节点,仅 文件夹有具体实现
    void add(FileSystemComponent component);
    // 删除节点,仅 文件夹有具体实现
    void remove(FileSystemComponent component);
    // 显示节点,
    void display();
}

文件类

java 复制代码
public class FileLeaf implements FileSystemComponent {

    private String name;
    
    // 常规的 构造方法、getter、setter,不再赘述

    @Override
    public void add(FileSystemComponent component) {
        System.out.println("文件节点,不支持添加下一个节点!");
    }

    @Override
    public void remove(FileSystemComponent component) {
        System.out.println("文件节点,不支持移除对应的节点!");
    }

    @Override
    public void display() {
        System.out.println("文件 : "+ name);
    }
}

文件夹类

java 复制代码
public class FloderComposite implements FileSystemComponent{

    private String name;
	
	// 这个就是自包含的类型
    private List<FileSystemComponent> fileList;
   // 常规的 构造方法、getter、setter,不再赘述

    @Override
    public void add(FileSystemComponent component) {
        if (fileList == null || fileList.isEmpty()){
            fileList = new ArrayList<>();
        }

        fileList.add(component);
        System.out.println("文件夹 "+name+" 添加文件成功!\n");
    }

    @Override
    public void remove(FileSystemComponent component) {
        if (fileList != null && !fileList.isEmpty()){
            fileList.remove(component);
        }
        System.out.println("文件夹 "+name+" 移除文件成功!\n");
    }

    @Override
    public void display() {
        // todo 实际上,此处是个递归操作
        System.out.println("文件夹 "+name+" 展示 begin-----");
        if (fileList != null && !fileList.isEmpty()){
            for (FileSystemComponent fileSystemComponent : fileList) {
                fileSystemComponent.display();
            }
        }
        System.out.println("文件夹 "+name+" 展示 end----- \n");
    }
}

使用案例

java 复制代码
public class CompositeTest {

    /**
     * 目录结构如下
     * | -- root
     *      | -- floder1
     *          | -- file1
     *      | -- floder2
     *          | -- file2
     */

    public static void main(String[] args) {
        // 创建两个文件对象
        FileLeaf file1 = new FileLeaf("file1");
        FileLeaf file2 = new FileLeaf("file2");
        // 创建两个文件夹对象
        FloderComposite floder1 = new FloderComposite("floder1");
        FloderComposite floder2 = new FloderComposite("floder2");
        // 创建一个根目录文件夹对象
        FloderComposite root = new FloderComposite("root");
        // 将文件/文件夹 对象添加到 根目录对象中
        floder1.add(file1);
        floder2.add(file2);
        root.add(floder1);
        root.add(floder2);
        // 展示一下文件夹中的内容
        root.display();
    }
}
复制代码
运行结果:

文件夹 floder1 添加文件成功!

文件夹 floder2 添加文件成功!

文件夹 root 添加文件成功!

文件夹 root 添加文件成功!

文件夹 root 展示 begin-----
文件夹 floder1 展示 begin-----
文件 : file1
文件夹 floder1 展示 end----- 

文件夹 floder2 展示 begin-----
文件 : file2
文件夹 floder2 展示 end----- 

文件夹 root 展示 end----- 
相关推荐
听闻风很好吃10 分钟前
Java设计模式之观察者模式:从入门到架构级实践
java·观察者模式·设计模式
胎粉仔1 小时前
Swift —— delegate 设计模式
开发语言·设计模式·swift
十五年专注C++开发2 小时前
面试题:请描述一下你在项目中是如何进行性能优化的?针对哪些方面进行了优化,采取了哪些具体的措施?
开发语言·数据结构·c++·qt·设计模式·性能优化
小马爱打代码2 小时前
设计模式:命令模式-解耦请求与执行的完美方案
设计模式·命令模式
都叫我大帅哥2 小时前
代码界的击鼓传花:责任链模式的接力艺术
java·后端·设计模式
wenbin_java5 小时前
设计模式之状态模式:优雅管理对象行为变化
设计模式·状态模式
offerwa6 小时前
设计模式实战:解锁代码复用与扩展的艺术
设计模式
未定义.2217 小时前
UML-饮料自助销售系统(无法找零)序列图
设计模式·流程图·状态模式·软件工程·需求分析·uml
骊山道童7 小时前
设计模式-代理模式
设计模式
小马爱打代码7 小时前
设计模式:外观模式 - 简化复杂系统调用的利器
设计模式·外观模式