设计模式-组合模式

核心思想

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

场景使用

  • 比如文件夹和文件,都有增加、删除等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);
    }
}
相关推荐
码农学院15 分钟前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽1 小时前
【工具】pom文件的<packaging>
java·maven
l156469481 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
布吉岛的石头2 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123453 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw3 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
M1A14 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
RainCity4 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy4 小时前
23-Java 构造函数
java·后端
坚持的小马4 小时前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq