设计模式-结构型-组合模式

1、定义

组合模式:将对象组成树形结构以表示“整体-部分”的层次结构

写法

//目录抽象类
public abstract class Dir {

    private String name;

    protected List<Dir> dirs = new ArrayList<>(  );

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

    public abstract void addDir(Dir dir);

    public abstract void rmDir(Dir dir);

    public abstract void clear();

    public abstract void print();

    public abstract List<Dir> getFiles();

    public  String getName(){
        return name;
    }
}


public class File extends Dir{

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

    @Override
    public void addDir(Dir dir) {
        throw new UnsupportedOperationException("文件对象不支持该操作!");
    }

    @Override
    public void rmDir(Dir dir) {
        throw new UnsupportedOperationException("文件对象不支持该操作!");
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException("文件对象不支持该操作!");
    }

    @Override
    public void print() {
        System.out.print(getName());
    }

    @Override
    public List<Dir> getFiles() {
        throw new UnsupportedOperationException("文件对象不支持该操作!");
    }

}

public class Folder extends Dir{

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

    @Override
    public void addDir(Dir dir) {
        dirs.add( dir );
    }

    @Override
    public void rmDir(Dir dir) {
        dirs.remove( dir );
    }

    @Override
    public void clear() {
        dirs.clear();
    }

    @Override
    public void print() {
        System.out.print(getName() + "(");
        Iterator<Dir> iter = dirs.iterator();
        while (iter.hasNext()) {
            Dir dir = iter.next();
            dir.print();
            if(iter.hasNext()){
                System.out.print(", ");
            }
        }
        System.out.print(")");
    }

    @Override
    public List<Dir> getFiles() {
        return dirs;
    }
}

public class TestMain {

    /**
     * 组合模式表示 : 整体-部分的关系
     * @param args 树型结构
     */
    public static void main(String[] args) {

        //构造一个目录对象表示C盘根目录
        Dir diskC = new Folder("C");

        //C盘根目录下有一个文件Log.txt
        diskC.addDir(new File("Log.txt"));

        //C盘根目录下有三个目录Windows、PerfLogs、Program File
        Dir dirWin = new Folder("Windows");

        //Windows目录下有文件explorer.exe
        dirWin.addDir(new File("explorer.exe"));
        diskC.addDir(dirWin);

        //打印出文件结构
        diskC.print();

    }

}

代码示例

https://github.com/yinlingchaoliu/23-design-pattern

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【学习难度:★★★☆☆,使用频率:★★★★☆】直接出处:组合模式梳理和学习:https://github.com/...
    BruceOuyang阅读 4,642评论 0 1
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,669评论 2 45
  • 人物年龄:28附近,生活品质高(真实人物素材) 人物职业:辅助、审核三板企业上市(对接企业资料),总监助理 加人渠...
    陈少爷的书阅读 851评论 0 0
  • 我的朋友帮助过我的朋友给我过快乐,我的朋友给我过温暖,我的朋友总是在,我需要的时候帮助我。有一次我在学校的院子中玩...
    卢子伊阅读 1,878评论 0 0
  • 绵山险绝地 清明始于此 ---北国苍狼---- 沿山西大运高速公路南下,太原南约170公里处的汾河东岸,一座...
    北国苍狼阅读 3,355评论 2 1