基于SpringBoot设计模式之结构型设计模式·组合模式

文章目录

介绍

  能够使容器与内容具有一致性,创造出递归结构的模式就是 Composite 模式。Composite 在英文中是"混合物""复合物"的意思。

  以目录为例,在计算机中,某个目录下有文件、文件夹。文件夹下面还有文件和文件夹。无限下去,因而形成递归。

开始

架构图

定义条目

java 复制代码
public interface Entry {

    /**
     * 添加
     *
     * @param entry
     */
    void add(Entry entry);

    /**
     * 打印整颗树
     *
     * @param prefix
     */
    void printList(String prefix);

    /**
     * 获取名称
     *
     * @return
     */
    String getName();

    /**
     * 获取大小
     *
     * @return
     */
    int getSize();

}

定义文件

java 复制代码
public class File implements Entry {

    private final String name;
    private final int size;

    public File(String name, int size) {
        this.name = name;
        this.size = size;
    }

    @Override
    public void add(Entry entry) {

    }

    @Override
    public void printList(String prefix) {
        System.out.println(prefix + "/" + name + " ( " + getSize() + " )");
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        return size;
    }


}

定义文件夹

java 复制代码
public class Directory implements Entry {

    private final String name;
    private final List<Entry> directoryList = new ArrayList<>();

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

    @Override
    public void add(Entry entry) {
        directoryList.add(entry);
    }

    @Override
    public void printList(String prefix) {
        System.out.print(prefix + "/" + name);
        System.out.println(" ( " + getSize() + " )");
        for (Entry next : directoryList) {
            next.printList(prefix + "/" + name);
        }
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getSize() {
        int size = 0;
        for (Entry next : directoryList) {
            size += next.getSize();
        }
        return size;
    }

}

测试样例

java 复制代码
@Slf4j
@SpringBootTest(classes = CompositeApplication.class)
public class TestComposite {

    @Test
    public void testTree() {

        Entry entry = new Directory("root");
        Entry bin = new Directory("bin");
        Entry tmp = new Directory("tmp");
        Entry usr = new Directory("usr");
        entry.add(bin);
        entry.add(tmp);
        entry.add(usr);

        Entry vi = new File("vi", 20);
        Entry latex = new File("latex", 30);
        bin.add(vi);
        bin.add(latex);

        entry.printList("");

        System.out.println("当前目录 root 一共大小:" + entry.getSize());
        System.out.println("当前目录 bin 一共大小:" + bin.getSize());
        System.out.println("当前目录 tmp 一共大小:" + tmp.getSize());
        System.out.println("当前目录 usr 一共大小:" + usr.getSize());

        bin.printList("/root");
    }

}

总结

  使用 Composite 模式可以使容器与内容具有一致性,也可以称其为多个和单个的一致性,即将多个对象结合在一起,当作一个对象进行处理。

相关推荐
RuoyiOffice11 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
RuoyiOffice12 小时前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office
百思不得小李13 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
爱你真是太好了16 小时前
上下文组成以及如何压缩
设计模式
软件技术NINI19 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang19 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
freejackman20 小时前
【工程化】从“单兵作战”到“多引擎架构”:基于门面模式的重构实战
大数据·数据库·hive·sql·测试工具·设计模式·架构
RuoyiOffice20 小时前
固定资产维修管理:从报修、审批到办结,原资产卡怎么回查?
spring boot·固定资产·ruoyi office·资产维修·维修审批·维修办结·资产履历
招风的黑耳21 小时前
SpringBoot+Vue+MySQL 民宿在线预定平台 完整可运行版(源码+文档)
vue.js·spring boot·mysql
Java码农也是农1 天前
Spring 事务详解:@Transactional 如何生效、何时回滚、传播行为怎么选
java·spring boot·spring·事务