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

创建型

1,单例设计模式
2,工厂设计模式
3,建造者设计模式
4,原型设计模式

结构型

5,代理设计模式
6,桥接设计模式
7,装饰设计模式
8,适配器设计模式
9,外观设计模式
10,享元设计模式
11,组合设计模式

行为型

12,模板设计模式

13,观察者模式

14,策略设计模式


组合模式简介

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

使用场景

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

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

UML图

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<FileSystemNode> 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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ang_qq_252390816

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值