23种设计模式-组合模式(文件系统)

定义:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。(联想:文件-文件夹、view-viewGroup)
使用场景:
表示对象的部分-整体层次结构时;
从一个整体中能够独立出部分模块或功能的场景;

代码实现一个文件系统

/**
 *表示文件和文件夹的抽象类
 */
public abstract class Dir {
    /**
     * 声明一个List成员变量存储文件夹下的所有元素
     */
    protected List dirs = new ArrayList<>();
    private String name;//当前文件或文件夹名

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

    /**
     * 添加一个文件或文件夹
     *
     * @param dir
     */
    public abstract void addDir(Dir dir);

    /**
     * 移除一个文件或文件夹
     *
     * @param dir
     */
    public abstract void rmDir(Dir dir);

    /**
     * 清空文件夹下所有元素
     */
    public abstract void clear();

    /**
     * 输出文件夹目录结构
     */
    public abstract void print();

    /**
     * 获得文件夹下所有的文件或子文件夹
     *
     * @return
     */
    public abstract List getFiles();

    public String getName() {
        return name;
    }
}


/**
 * 文件夹
 */
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() {
        Log.e_(getName()+"(");
        Iterator iter=dirs.iterator();
        while (iter.hasNext()){
            Dir dir=iter.next();
            dir.print();
            if (iter.hasNext()){
                Log.e_(",");
            }
        }
        Log.e_(")");
    }

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


/**
 * 文件
 */
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() {
        Log.e_(getName());
    }

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

public class Client {
    public static void main(String[] args) {
        //构建一个目录对象表示C盘根目录
        Dir diskC = new Folder("C");
        //C盘根目录下有一个文件ImbaMallLog.txt
        diskC.addDir(new File("ImbaMallLog.txt"));
        //C盘根目录下有3个子目录Windows、PerfLogs、Program File
        Dir dirWin = new Folder("Windows");
        dirWin.addDir(new File("explorer.exe"));
        diskC.addDir(dirWin);

        Dir dirPer = new Folder("PerfLogs");
        dirPer.addDir(new Folder("null.txt"));
        diskC.addDir(dirPer);

        Dir dirPro = new Folder("Program File");
        dirPro.addDir(new File("ftp.txt"));
        diskC.addDir(dirPro);

        diskC.print();
    }
}

//打印结果:C(ImbaMallLog.txt,Windows(explorer.exe),PerfLogs(null.txt()),Program File(ftp.txt))

你可能感兴趣的:(23种设计模式-组合模式(文件系统))