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();  // 展示根节点的文件系统信息
    }

运行结果:

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

总结:

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

学海无涯苦作舟!!!

相关推荐
huang_xiaoen6 小时前
java设计模式之桥接模式(重生之我在地府当孟婆)
设计模式·桥接模式
HappyGame026 小时前
设计模式-观察者模式
观察者模式·设计模式
渊渟岳7 小时前
掌握设计模式--解释器模式
设计模式
牵牛老人17 小时前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
肥仔哥哥193018 小时前
设计模式分类与定义(高软55)
设计模式·软考·高软·设计模式分类
云徒川21 小时前
【设计模式】过滤器模式
windows·python·设计模式
找了一圈尾巴1 天前
设计模式(结构性)-代理模式
设计模式·代理模式
渊渟岳1 天前
掌握设计模式--模板方法模式
设计模式
程序员JerrySUN2 天前
设计模式 Day 2:工厂方法模式(Factory Method Pattern)详解
设计模式·工厂方法模式
牵牛老人2 天前
C++设计模式-迭代器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·迭代器模式