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

运行结果:

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

总结:

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

学海无涯苦作舟!!!

相关推荐
星星点点洲1 小时前
【设计模式区别】装饰器模式和适配器模式区别
设计模式·适配器模式·装饰器模式
Tang10242 小时前
分析 Android Jetpack Lifecycle 的设计思想及其与生命周期感知组件的交互原理
设计模式
?abc!2 小时前
设计模式基础概念(结构型模式):适配器模式(Adapter Pattern)
python·设计模式·适配器模式
ApeAssistant3 小时前
Spring + 设计模式 (十八) 行为型 - 责任链模式
spring·设计模式
前端大白话4 小时前
震惊!90%前端工程师都踩过的坑!Vue中`$el`和`$refs`获取DOM元素的10大区别与实战指南
前端·vue.js·设计模式
前端大白话4 小时前
惊!10行代码实现fetch并发请求!前端工程师必看的错误处理神操作
前端·javascript·设计模式
ApeAssistant4 小时前
Spring + 设计模式 (十六) 行为型 - 状态模式
spring·设计模式
ApeAssistant4 小时前
Spring + 设计模式 (十五) 行为型 - 模板方法模式
spring·设计模式
lybugproducer8 小时前
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
java·设计模式·建造者模式·简单工厂模式·工厂方法模式·抽象工厂模式·面向对象
cooldream200921 小时前
深入理解MVP架构:让UI层与业务逻辑完美分离的设计模式
ui·设计模式·架构·系统架构师