十、组合模式——他大舅他二舅都是他舅

本文介绍组合模式的概念及其在Java中的实现方式。通过一个文件系统结构的例子,展示了如何利用组合模式来组织对象,使得客户端能一致地处理容器对象和叶子对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

结构型 包含了 代理模式、 桥接模式、 装饰器模式、适配器模式、门面模式、组合模式、 享元模式。

组合模式

组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。
组合模式将对象组织为树形结构,每一个对象都是节点,无论是子树和叶子都可以被统计地进行递归处理。

1.定义FileNode 抽象类

public abstract class FileNode {
    private String path;

    public FileNode(String path) {
        this.path = path;
    }

    public abstract int count();
}

2.定义目录、文件继承于FileNode

public class File extends FileNode {
    public File(String path) {
        super(path);
    }
    @Override
    public int count() {
        return 1;
    }
}

public class Directory extends FileNode {
    private List<FileNode> subNodes = new ArrayList<>();
    public void add(FileNode element) {
        subNodes.add(element);
    }
    public Directory(String path) {
        super(path);
    }
    @Override
    public int count() {
        int count = 0;
        for(FileNode node:subNodes){
            count += node.count();
        }
        return count;
    }
}

3.统计所有节点数量

public class Main {
    public static void main(String[] args) {
        Directory root = new Directory("/");
        Directory d = new Directory("/d");
        Directory e = new Directory("/e");
        FileNode leaf1 = new File("/a.txt");
        FileNode leaf2 = new File("/b.txt");
        FileNode leaf3 = new File("/c.txt");
        FileNode leaf4 = new File("/d/a.txt");
        FileNode leaf5 = new File("/d/e/a.txt");

        root.add(d);

        root.add(leaf1);
        root.add(leaf2);
        root.add(leaf3);

        d.add(leaf4);
        d.add(e);

        e.add(leaf5);

        System.out.println(root.count());
        System.out.println(d.count());
        System.out.println(e.count());
    }
}

运行结果,能够递归进行统计:

5
2
1

总结

组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。
类似树形结构的业务场景可以考虑组合模式,比如机构+人员,机构有下级机构及员工,因此在OA系统中可以进行这样的设计。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值