设计模式-组合模式

核心思想

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

场景使用

  • 比如文件夹和文件,都有增加、删除等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);
    }
}
相关推荐
num_killer7 小时前
小白的Langchain学习
java·python·学习·langchain
期待のcode8 小时前
Java虚拟机的运行模式
java·开发语言·jvm
程序员老徐8 小时前
Tomcat源码分析三(Tomcat请求源码分析)
java·tomcat
a程序小傲8 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
仙俊红8 小时前
spring的IoC(控制反转)面试题
java·后端·spring
阿湯哥8 小时前
AgentScope Java 集成 Spring AI Alibaba Workflow 完整指南
java·人工智能·spring
小楼v8 小时前
说说常见的限流算法及如何使用Redisson实现多机限流
java·后端·redisson·限流算法
与遨游于天地9 小时前
NIO的三个组件解决三个问题
java·后端·nio
czlczl200209259 小时前
Guava Cache 原理与实战
java·后端·spring
yangminlei9 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot