Java设计模式-结构性设计模式(组合设计模式)

简介

1、⼜叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作
2、组合模式使得⽤户可以使⽤⼀致的⽅法操作单个对象和组合对象
3、部分-整体对象的基本操作多数是⼀样的,但是应该还会有不⼀样的地⽅
4、核⼼:组合模式可以使⽤⼀棵树来表示

应⽤场景

1、银⾏总⾏,总⾏有前台、后勤、⽹络部⻔等,辖区下还有地⽅分⾏,也有前台、后勤、⽹络部⻔,最⼩的分⾏就没有⼦分⾏了
2、公司也是,总公司下有⼦公司,每个公司⼤部分的部⻔都类似
3、⽂件夹和⽂件,都有增加、删除等api,也有层级管理关系
4、当想表达对象的部分-整体的层次结构
5、当我们的要处理的对象可以⽣成⼀颗树形结构,我们要对树上的节点和叶⼦进⾏操作时,它能够提供⼀致的⽅式,⽽不⽤考虑它是节点还是叶⼦

角色

1、组合部件(Component):它是⼀个抽象接⼝,表示树根,例⼦:总⾏
2、合成部件(Composite):和组合部件类似,也有⾃⼰的⼦节点,例⼦:总⾏下的分⾏
3、叶⼦(Leaf):在组合中表示⼦节点对象,注意是没有⼦节点,例⼦:最⼩地⽅的分⾏

demo
创建根节点

/**
 * 根节点,抽象类,通用的属性和方法
 **/
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);

}

创建文件夹

/**
 * 具体的文件夹,里面可以添加子文件夹或者文件
 **/

public class Folder extends Root {

    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){
            //每个下级,横线多2个
            r.display(depth+2);
        }
    }
}

11

/**
 * 这个类是没有节点,不用存储其他子类数组,所以是叶子节点
 **/

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());

    }
}

测试

public class Main {

    public static void main(String[] args) {

        //创造根文件夹
        Root root1 = new Folder("C://");

        //建立子文件
        Root desktop = new Folder("桌面");
        Root myComputer = new Folder("我的电脑");

        //建立子文件
        Root javaFile = new File("HelloWorld.java");

        //建立文件夹关系
        root1.addFile(desktop);
        root1.addFile(myComputer);

        //建立文件关系
        myComputer.addFile(javaFile);

        //从0级开始展示,每下一级,多2条横线
        root1.display(0);

        //另外一个根
        Root root2 = new Folder("D://");
        root2.display(0);

    }
}

结果

C://
--桌面
--我的电脑
---HelloWorld.java
D://
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值