11.设计模式-组合模式

组合模式就是将对象组成类似与树状结构的一种模式。统一叶子对象和组合对象的模式。我们常见的比如文件夹,下面有文件夹以及具体的文件,各种嵌套。包括业务开发过程当中使用到的动态菜单,商品的分类归属等等场景。下面来看下具体的代码。

定义一个File抽象类

这里为什么要在父类抛出异常呢,因为叶子节点其实没有子类,所以就不存在添加,删除的操作。具体情况可以根据业务场景进行设计。

package com.example.design.composite.demo2;

/**
 * 定义文件的抽象类,里面包含了查看文件内容,添加文件,删除文件,查找文件的功能。
 */
public abstract class File {
    /**
     * 列出组合结构
     * @param preStr
     */
    public abstract void listFile(String preStr);

    /**
     * 添加
     * @param file
     * @throws Exception
     */
    public void addFile(File file) throws Exception{
        throw new Exception("具体文件不支持添加文件");
    }

    /**
     * 删除
     * @param file
     * @throws Exception
     */
    public void removeFile(File file) throws Exception{
        throw new Exception("具体文件不支持移除文件文件");
    }

    /**
     * 获取
     * @param index
     * @return
     * @throws Exception
     */
    public File getFile(Integer index) throws Exception{
        throw new Exception("具体文件不支持获取文件");
    }

}

定义组合对象

package com.example.design.composite.demo2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class FileDir extends  File {
    private String name;
    List<File> childFiles=null;
    public FileDir(String name) {
        this.name=name;
    }
    /**
    *利用递归循环进行处理
    *
    *
    */
    @Override
    public void listFile(String preStr){
        System.out.println(preStr+"+"+name);
        preStr += " ";
        if(childFiles!=null && childFiles.size()>0){
            for (File file:childFiles) {
                file.listFile(preStr);
            }
        }
    }

    /**
     * 添加文件
     * @param file
     * @throws Exception
     */
    @Override
    public void addFile(File file) throws Exception {
        if(null!=file){
            if (childFiles == null) {
                childFiles = new ArrayList<>();
            }
            childFiles.add(file);
        }
    }

    /**
     * 移除文件
     * @param file
     * @throws Exception
     */
    @Override
    public void removeFile(File file) throws Exception {
        if(null != file){
            if (childFiles != null && childFiles.size()>0) {
                childFiles.remove(file);
            }
        }
    }

    @Override
    public File getFile(Integer index) {
        if(childFiles!=null&& index>0 && index<childFiles.size()){
            return childFiles.get(index);
        }
        return null;
    }
}

定义叶子节点

package com.example.design.composite.demo2;

public class FileItem extends  File {
    private String name;

    public FileItem(String name) {
        this.name=name;
    }
    @Override
    public void listFile(String preStr){
        System.out.println(preStr+"-"+name);
    }

}

进行测试

package com.example.design.composite.demo2;

public class FileTest {
    public static void main(String[] args) throws Exception{
        File root = new FileDir("根目录");
        File levelOne = new FileDir("目录1");
        File levelTwo = new FileDir("目录2");
        File levelThree = new FileDir("目录3");
        root.addFile(levelOne);
        root.addFile(levelTwo);
        root.addFile(levelThree);

        File levelOneOne = new FileDir("目录1-1");
        File levelOneTwo = new FileDir("目录1-2");
        File levelOneThree = new FileDir("目录1-3");
        levelOne.addFile(levelOneOne);
        levelOne.addFile(levelOneTwo);
        levelOne.addFile(levelOneThree);

        File levelFileOneOne = new FileItem("文件1-1");
        levelOne.addFile(levelFileOneOne);

        File levelFileTwoOne = new FileItem("文件2-1");
        File levelFileTwoTwo = new FileItem("文件2-2");
        File levelFileTwoThree = new FileItem("文件2-3");
        levelTwo.addFile(levelFileTwoOne);
        levelTwo.addFile(levelFileTwoTwo);
        levelTwo.addFile(levelFileTwoThree);


        File levelFileTreeOne = new FileItem("文件3-1");
        File levelFileTreeTwo = new FileItem("文件3-2");
        File levelFileTreeThree = new FileItem("文件3-3");
        levelThree.addFile(levelFileTreeOne);
        levelThree.addFile(levelFileTreeTwo);
        levelThree.addFile(levelFileTreeThree);
        root.listFile("");


    }
}

输出结果

其中组合对象前面都含有+,叶子对象前面都含有-,安装顺序排列开来

+根目录
 +目录1
  +目录1-1
  +目录1-2
  +目录1-3
  -文件1-1
 +目录2
  -文件2-1
  -文件2-2
  -文件2-3
 +目录3
  -文件3-1
  -文件3-2
  -文件3-3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值