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

运行结果:

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

总结:

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

学海无涯苦作舟!!!

相关推荐
李广坤32 分钟前
状态模式(State Pattern)
设计模式
李广坤2 小时前
观察者模式(Observer Pattern)
设计模式
李广坤3 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤3 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤3 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,6 小时前
java23种设计模式之前言
设计模式
Asort7 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机7 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の10 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom17 小时前
[C++] --- 常用设计模式
开发语言·c++·设计模式