Java设计模式 _结构型模式_组合模式

一、组合模式

1、组合模式

组合模式(Composite Pattern)是这一种结构型设计模式。又叫部分整体模式。组合模式依据树形结构来组合对象,用来表示部分以及整体层次关系。即:创建了一个包含自己对象组的类,该类提供了修改相同对象组的方式。

2、示例场景

(1)、公司管理管理关系。如,总经理直接下级包含多个总监,每个总监下包含多个负责人,每个负责人下包含多个具体员工

(2)、其他一些树形结构使用的场景。

3、实现思路

(1)、实体类中,定义包含自身对象或者自身对象集合的属性。

(2)、定义添加和删除自身集合属性方法。

(3)、定义展示或操作自身及孩子节点的具体业务方法。

二、代码示例

1、代码示例

java 复制代码
// 定义文件系统抽象类规范
import lombok.Data;
import java.util.List;
@Data
public abstract class FileSystemElement {
    protected String name;
    protected List<FileSystemElement> elementList;

    public abstract boolean addElement(FileSystemElement element);
    public abstract boolean removeElement(FileSystemElement element);
    public abstract void showElement();
}
// 定义文件夹实现类
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;

public class FolderElement extends FileSystemElement {

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

    @Override
    public boolean addElement(FileSystemElement element) {
        if (this.elementList==null){
            this.elementList = new ArrayList<>();
        }
        this.elementList.add(element);
        return true;
    }

    @Override
    public boolean removeElement(FileSystemElement element) {
        if (!CollectionUtils.isEmpty(elementList)) {
            for (FileSystemElement systemElement : elementList) {
                if (element.getName().equals(systemElement.getName())) {
                    elementList.remove(systemElement);
                    break;
                }
            }
        }
        return true;
    }

    @Override
    public void showElement() {
        System.out.println("目录名称:" + name+",包含内容如下:");
        if (!CollectionUtils.isEmpty(elementList)) {
            for (FileSystemElement systemElement : elementList) {
                systemElement.showElement();
            }
        }
        System.out.println("目录名称:" + name+",包含如上" );
    }
}
// 定义文件实现类
public class FileElement extends FileSystemElement {

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

    @Override
    public boolean addElement(FileSystemElement element) {
        System.out.println("当前节点为文件,不能创建节点");
        return false;
    }

    @Override
    public boolean removeElement(FileSystemElement element) {
        System.out.println("当前节点为文件,不能删除节点");
        return false;
    }

    @Override
    public void showElement() {
        System.out.println("文件名称:" + name);
    }
}
// 测试
public static void main(String[] args) {
        FileSystemElement rootDir = new FolderElement("根目录");

        FileSystemElement dir1 = new FolderElement("目录1");
        FileSystemElement dir2 = new FolderElement("目录2");
        FileSystemElement dir3 = new FolderElement("目录3");

        FileSystemElement file1 = new FileElement("文件1");
        FileSystemElement file2 = new FileElement("文件2");
        FileSystemElement file3 = new FileElement("文件3");

        rootDir.addElement(dir1);
        rootDir.addElement(dir2);
        dir1.addElement(dir3);
        dir1.addElement(file1);
        dir2.addElement(file2);
        dir3.addElement(file3);

        rootDir.showElement();  // 展示根节点的文件系统信息
    }

运行结果:

可以看到当完整的构建了组合模式的时候,能够根据其中的一个节点获取到相关子节点的信息。

总结:

本例仅展示了一个子节点的信息,如果需要定义兄弟节点等多个维度的信息,则需要定义多个属性实例及对应的增删方法。

学海无涯苦作舟!!!

相关推荐
怕浪猫10 小时前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane199412 小时前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19942 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..2 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1502 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)3 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki3 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅663 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa3 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio
sarasuki4 天前
如何让 Agent 获取更多的能力?插件 / 技能系统
人工智能·设计模式·agent