10-组合模式

10-组合模式

1.使用组合模式实现一个文件系统

  1. 文件系统服务端。
public abstract class FileSystemNode {

    protected String path;

    public FileSystemNode(String path) {
        this.path = path;
    }

    public abstract int countNumOfFiles();
    public abstract long countSizeOfFiles();

    public String getPath() {
        return path;
    }
}

public class File extends FileSystemNode {

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

    @Override
    public int countNumOfFiles() {
        return 1;
    }

    @Override
    public long countSizeOfFiles() {
        java.io.File file = new java.io.File(path);
        if (file.exists()) {
            return file.length();
        }
        return 0;
    }
}

public class Directory extends FileSystemNode {

    private List<FileSystemNode> childNode = new ArrayList<>();

    public Directory(String path) {
        super(path);
    }

    @Override
    public int countNumOfFiles() {
        int numOfFiles = 0;
        for (FileSystemNode fileSystemNode : childNode) {
            numOfFiles += fileSystemNode.countNumOfFiles();
        }
        return numOfFiles;
    }

    @Override
    public long countSizeOfFiles() {
        int sizeOfSize = 0;
        for (FileSystemNode fileSystemNode : childNode) {
            sizeOfSize += fileSystemNode.countSizeOfFiles();
        }
        return sizeOfSize;
    }

    public void addChildNode(FileSystemNode fileOrDirectory) {
        childNode.add(fileOrDirectory);
    }

    public void removeChildNode(FileSystemNode fileSystemNode) {
        for (int i = 0;i < childNode.size();i++) {
            FileSystemNode node = childNode.get(i);
            if (node.getPath().equalsIgnoreCase(fileSystemNode.getPath())) {
                childNode.remove(i);
                break;
            }
        }
    }
}
  1. 文件系统客户端构建目录树。
public static void main(String[] args) {
    /**
     * /
     * /home/a.txt
     * /home/b.txt
     * /opt
     */
    Directory fileSystemTree = new Directory("/");
    Directory homeNode = new Directory("/home/");
    Directory optNode = new Directory("/opt");
    fileSystemTree.addChildNode(homeNode);
    fileSystemTree.addChildNode(optNode);

    File node_home_a = new File("/home/a.txt");
    File node_home_b = new File("/home/b.txt");
    homeNode.addChildNode(node_home_a);
    homeNode.addChildNode(node_home_b);

    System.out.println("/ files num: " + fileSystemTree.countNumOfFiles());
}

2.组合模式总结

  1. 组合模式是一种特殊的设计模式,只有在数据为树状时才能使用,所有在开发中使用的不是很多。
  2. <<设计模式:可复用面向对象软件的基础>>中对组合模式的描述:将一组对象组织成树形结构,以表示一种"部分-整体"的层次结构。组合模式让客户端可以统一单个对象和组合对象的处理逻辑。
  3. 组合模式的应用:目录树,表示目录和文件的树形结构;人力树,表示部门和人员的树状结构。
posted @ 2022-11-27 08:50  行稳致远方  阅读(21)  评论(0)    收藏  举报