组合模式(部分整体模式)—结构型

简介

组合模式是指:将一组对象组织成树形结构,以表示一种“部分 - 整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性;

使用场景

1,表示对象的部分-整体的层次结构时;

2,从一个整体中能独立出部分模块或功能的场景;

UML图

组合模式(部分整体模式)—结构型_第1张图片

Component:抽象根节点

Leaf:具体叶子节点

Composite:具体枝干节点

下面以一个例子来说明组合设计模式;

电脑的文件系统大家使用过电脑的应该都熟悉,文件加中可以有文件夹或者文件;然后文件夹中还可以有文件夹或文件;这个文件管理系统就和我们今天要讲的组合模式非常匹配;下面这个文件系统为例阐述组合模式的实现;

代码实现

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 0;
        return file.length();
    }
}

文件夹类

public class Directory extends FileSystemNode {
    private List subNodes = new ArrayList<>();

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

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

    @Override
    public long countSizeOfFiles() {
        long sizeofFiles = 0;
        for (FileSystemNode fileOrDir : subNodes) {
            sizeofFiles += fileOrDir.countSizeOfFiles();
        }
        return sizeofFiles;
    }

    public void addSubNode(FileSystemNode fileOrDir) {
        subNodes.add(fileOrDir);
    }

    public void removeSubNode(FileSystemNode fileOrDir) {
        int size = subNodes.size();
        int i = 0;
        for (; i < size; ++i) {
            if (subNodes.get(i).getPath().equalsIgnoreCase(fileOrDir.getPath())) {
                break;
            }
        }
        if (i < size) {
            subNodes.remove(i);
        }
    }
}

Client:客户端大多数之使用者

public class client {
    public static void main(String[] args) {
        Directory fileSystemTree = new Directory("/");
        Directory node_android = new Directory("/android/");
        Directory node_java = new Directory("/java/");
        fileSystemTree.addSubNode(node_android);
        fileSystemTree.addSubNode(node_java);
        File node_android_a = new File("/android/a.txt");
        File node_java_b = new File("/android/b.txt");
        Directory node_android_movies = new Directory("/android/movies/");
        node_android.addSubNode(node_android_a);
        node_java.addSubNode(node_java_b);
        node_android.addSubNode(node_android_movies);
        File node_android_movies_c = new File("/android/movies/c.avi");
        node_android_movies.addSubNode(node_android_movies_c);
        System.out.println("/files num:" + fileSystemTree.countNumOfFiles());
        System.out.println("/android/ files num:" + node_android.countNumOfFiles());
        System.out.println("/java/ files num:" + node_java.countNumOfFiles());
    }
}

运行log输出:

/files num:3
/android/ files num:2
/java/ files num:1

 

你可能感兴趣的:(设计模式)