设计模式-组合模式

核心思想

  • 组合模式可以使用一棵树来表示
  • 组合模式使得用户可以使用一致的方法操作单个对象和组合对象
  • 组合模式又叫部分整体模式,将对象组合成树形结构以表示"部分-整体"的层次结构,可以更好的实现管理操作,部分-整体对象的操作基本一样,但是应该还会有不一样的地方

场景使用

  • 比如文件夹和文件,都有增加、删除等api,也有层级管理关系
  • 比如公司,总公司下有子公司,每个公司的部门都类似

优缺点

优点

  • 方便创建出复杂的层次结构
  • 客户端只需要面对一致的对象而不用考虑整体部分的问题

缺点

  • 需要花更多的时间理清类之间的层次关系

代码示例

根节点(抽象类-Component)

java 复制代码
public abstract class Root {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void addFile(Root root);

    public abstract void removeFile(Root root);

    public abstract void display(int depth);

}

具体文件夹类(Composite)

java 复制代码
public class Folder extends Root {

    private List<Root> folders = new ArrayList<>();


    public Folder(String name) {
        super(name);
    }

    public List<Root> getFolders() {
        return folders;
    }

    public void setFolders(List<Root> folders) {
        this.folders = folders;
    }

    @Override
    public void addFile(Root root) {
        folders.add(root);
    }

    @Override
    public void removeFile(Root root) {
        folders.remove(root);
    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        //打印横线和当前文件名
        System.out.println(sb.toString() + this.getName());

        for (Root r : folders) {
            //每个下级
            r.display(depth + 1);
        }
    }
}

具体的文件(Leaf)

java 复制代码
public class File extends Root {


    public File(String name) {
        super(name);
    }

    @Override
    public void addFile(Root root) {

    }

    @Override
    public void removeFile(Root root) {

    }

    @Override
    public void display(int depth) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        //打印横线和当前文件名
        System.out.println(sb.toString() + this.getName());

    }
}

测试

java 复制代码
public class AppRun {
    public static void main(String[] args) {

        //创造根⽂件夹
        Root root1 = new Folder("root");

        //建⽴⼦⽂件
        Root comp1 = new Folder("Composite1");
        Root comp2 = new Folder("Composite2");

        //建⽴⽂件夹关系
        root1.addFile(comp1);
        root1.addFile(comp2);

        //建⽴⽂件关系
        comp1.addFile(new File("leafA"));
        comp2.addFile(new File("leafB"));

        //展示
        root1.display(1);
    }
}
相关推荐
布局呆星1 分钟前
SpringBoot 基础入门
java·spring boot·spring
风吹迎面入袖凉30 分钟前
【Redis】Redisson的可重入锁原理
java·redis
w61001046633 分钟前
cka-2026-ConfigMap
java·linux·cka·configmap
语戚1 小时前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
quxuexi2 小时前
网络通信安全与可靠传输:从加密到认证,从状态码到可靠传输
java·安全·web
hrhcode2 小时前
【java工程师快速上手go】二.Go进阶特性
java·golang·go
小碗羊肉4 小时前
【从零开始学Java | 第三十一篇下】Stream流
java·开发语言
❀͜͡傀儡师4 小时前
Spring AI Alibaba vs. AgentScope:两个阿里AI框架,如何选择?
java·人工智能·spring