设计模式篇---组合模式

news2024/11/18 7:40:48

文章目录

      • 概念
      • 结构
      • 实例
      • 总结

概念

组合模式:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。
当我们开发中遇到树形结构的业务时,可以考虑使用组合模式。(我也没有想明白为啥叫组合模式,为啥不叫树形模式)

结构

组合模式类图如下:
在这里插入图片描述
Component(抽象构件):它可以是接口或者抽象类,是叶子构件和容器构件的接口,为其提供方法的声明。定义了访问和管理组件的方法。
Leaf(叶子构件):叶子构件是最底层的类,它没有子节点。对于一些没有的方法可以排出异常或者提示错误等方式进行处理。
Composite(容器构件):容器构件的子节点既可以是容器构件也可以是叶子构件,它提供了一个集合用于存储子节点,在其实现的业务方法中进行递归调用其子节点的业务方法。

实例

某公司要做一个杀毒软件,这个软件既可以对某个文件夹进行杀毒,也可以对指定某个文件进行杀毒,还支持为不同类型的文件提供不同的杀毒方式。现在用组合模式来实现这个功能。设计类图如下:
在这里插入图片描述
代码展示:

AbstractFile类,抽象的文件类。

public abstract class AbstractFile {

    public abstract void add(AbstractFile file);

    public abstract void remove(AbstractFile file);

    public abstract AbstractFile getChild(int i);

    public abstract void killVirus();
}

TextFile 文件

public class TextFile extends AbstractFile {

    private String name;

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


    @Override
    public void add(AbstractFile file) {
        System.out.println("不支持该方法");

    }

    @Override
    public void remove(AbstractFile file) {
        System.out.println("不支持该方法");

    }

    @Override
    public AbstractFile getChild(int i) {
        System.out.println("不支持该方法");
        return null;
    }

    @Override
    public void killVirus() {
        System.out.println("对文本文件杀毒 " + name);
    }
}

ImageFile 文件

public class ImageFile extends AbstractFile {

    private String name;

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

    @Override
    public void add(AbstractFile file) {
        System.out.println("不支持该方法");
    }

    @Override
    public void remove(AbstractFile file) {
        System.out.println("不支持该方法");
    }

    @Override
    public AbstractFile getChild(int i) {
        System.out.println("不支持该方法");
        return null;
    }

    @Override
    public void killVirus() {
        System.out.println("对图像文件杀毒 " + name);
    }
}

Folder

public class Folder extends AbstractFile {

    private List<AbstractFile> fileList = new ArrayList<AbstractFile>();

    private String name;

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

    @Override
    public void add(AbstractFile file) {
        fileList.add(file);
    }

    @Override
    public void remove(AbstractFile file) {
        fileList.remove(file);
    }

    @Override
    public AbstractFile getChild(int i) {
        return fileList.get(i);
    }

    @Override
    public void killVirus() {
        System.out.println("对文件夹杀毒 " + name);
        for (AbstractFile file : fileList) {
            file.killVirus();
        }

    }
}

客户端使用

public class Client {

    public static void main(String[] args) {
        AbstractFile folder1, folder2, folder3, file1, file2, file3, file4;

        folder1 = new Folder("Sunny的资料");
        folder2 = new Folder("图像文件夹");
        folder3 = new Folder("文本文件夹");

        file1 = new ImageFile("小龙女.jpg");
        file2 = new ImageFile("张无忌.gif");
        file3 = new TextFile("九阴真经.txt");
        file4 = new TextFile("葵花宝典.txt");


        folder1.add(folder2);
        folder1.add(folder3);

        folder2.add(file1);
        folder2.add(file2);

        folder3.add(file3);
        folder3.add(file4);


        //对folder 1 树形文件夹进行消毒
        folder1.killVirus();
    }

}

打印结果如下:
在这里插入图片描述

总结

组合模式很适用于处理树形结构的业务场景,主要组件为容器组件和叶子组件,从容器组件开始遍历,一层一层的处理当前组件的业务场景。如果想要扩展新的组件,也无需修改代码,符合开闭原则。当树形结构或者具有整体和部分的层次结构时,希望忽略整体和部分的差异,被客户端一致的对待,可以考虑使用组合模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot实现财务管理系统项目【项目源码+论文说明】

基于springboot实现财务管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…

Ubuntu的EFI分区无法删除

本文解决的问题&#xff1a;双系统装完后需要删除ubuntu的分区&#xff0c;但是EFI系统分区无法删除。 第一步&#xff1a;cmd中输入命令 diskpart 并回车&#xff0c;如图中①&#xff1b; 第二步&#xff1a;在弹出窗口②中依次输入如下命令即可删除EFI分区&#xff1b; /…

基于springboot实现藏区特产销售平台项目【项目源码+论文说明】

基于springboot实现藏区特产销售管理平台演示 摘要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多藏区特产销售信息仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;使得对人力物…

USRP-2944 配件讲解,如何选择对应的配件

USRP-2944 产品图片 产品官网价格信息 查看附件和价格 硬件服务 NI硬件服务计划通过简化物流&#xff0c;延长正常运行时间以及根据业界标准维护数据的可追溯性&#xff0c;帮助您节省系统组装、设置和维护所需的时间和金钱。这些计划涵盖多年期维修服务&#xff0c;同时还提…

Python 循环

Python有两个基本的循环命令&#xff1a; while循环for循环 while循环 使用while循环&#xff0c;我们可以在条件为真的情况下执行一组语句。 示例&#xff0c;打印i&#xff0c;只要i小于6&#xff1a; i 1 while i < 6:print(i)i 1注意&#xff1a;记得增加i的值&a…

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB&#xff08;8位&#xff09;2.1.2字定义伪指令DW&#xff08;16位&#xff09;2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT&#xff08;了解&#xff09; 2.2 常用运算符2.2.1…

数据结构-- 并查集

0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…

【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都会…

拦截器以及统一功能的实现

目录 引言 实现一个简单的拦截器 拦截器小结 统一访问前缀 统一异常处理 统一返回参数 ControllerAdvice 引言 HandlerInterceptor是Spring MVC框架提供的一个拦截器接口&#xff0c;它用于对请求进行拦截和处理。在Spring MVC中&#xff0c;拦截器可以用于实现一些通用的功能…

什么是t检验?

t检验&#xff08;t-test&#xff09;是一种统计方法&#xff0c;用于比较两组数据之间的平均值是否存在显著差异。它通常用于分析两组样本的平均值是否具有统计学上的显著性差异。t检验基于正态分布的假设&#xff0c;它计算两组数据之间的t值&#xff0c;然后通过与t分布表进…

YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;公共场所监控场景下的大密度人群检测是否佩戴口罩&#xff0c;以及戴口罩的人证比对&#xff08;安检刷脸不用摘口罩&#xff09;、手机解锁、刷脸考勤等身份认证场景。数据集说明&#xff1a;人脸口罩佩戴检测数据集&#xff0c;真实场景的高质量图片…

reactnative 底部tab页面@react-navigation/bottom-tabs

使用react-navigation/native做的页面导航和tab‘ 官网&#xff1a;https://reactnavigation.org/docs/getting-started 效果图 安装 npm install react-navigation/nativenpm install react-navigation/bottom-tabs封装tabbar.js import { View, StyleSheet, Image } from …

【JavaEE】死锁问题 -- 多线程篇(5)

死锁问题 1. 死锁是什么?2. 如何避免死锁? 1. 死锁是什么? 概念 死锁是这样一种情形: 多个线程同时被阻塞, 它们中的一个或者全部都在等待某个资源被释放, 由于线程被无限期的阻塞, 因此程序不能正常终止。 死锁的三种常见的场景 一个线程, 一把锁, 但是是不可重入锁, 该线程…

新手上路:学会使用SELinux保护你的系统

1 Selinux的介绍 SELinux是为了提高系统安全性的机制。 它对系统的每一个程序、文件都引入了安全上下文。安全上下文标签&#xff0c;用于唯一标识文件、进程和资源。这些标签包括了安全策略的信息&#xff0c;允许SELinux强制执行策略。 1.1 Selinux关闭状态下 getenforce …

个微多账号聚合聊天管理如何实现?

在日常工作中&#xff0c;我经常遇到以下问题&#xff1a; 1. 微信号众多&#xff0c;需要频繁切换设备和账号&#xff0c;导致工作效率低下。 2. 无法及时回复客户消息&#xff0c;客户体验不尽如人意。 3. 难以随时掌握员工与客户的沟通情况&#xff0c;导致员工沟通质量难…

C语言实现把程序中自定义的print( )函数改写为等价的递归函数

完整代码&#xff1a; //把以下程序的 print( )函数改写为等价的递归函数。 #include<iostream> using namespace std; void print(int w) {for(int i1;i<w;i) {for(int j1;j<i;j){cout<<i<<" ";}} } void myPrint(int w) {// 当 w 为 1 时…

动手学深度学习—使用块的网络VGG(代码详解)

目录 1. VGG块2. VGG网络3. 训练模型 1. VGG块 经典卷积神经网络的基本组成部分是下面的这个序列&#xff1a; 1.带填充以保持分辨率的卷积层&#xff1b; 2.非线性激活函数&#xff0c;如ReLU&#xff1b; 3.汇聚层&#xff0c;如最大汇聚层。 定义网络块&#xff0c;便于我…

【LeetCode】67. 二进制求和

1 问题 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 2 答案 自己写…

【分类讨论】CF1834D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 这是个分类讨论题&#xff0c;一开始还以为是枚举什么的&#xff0c;发现根本枚举不了 注意到最终的答案就两种情况&#xff1a;区间包含 or 区间不包含 对于第一种情况&#xff0c;贡献的最大值就是mxlen - m…

【Arduino TFT】基于 ESP32 S7789 320x240 TFT实现的SD2 天气时钟

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-21 ❤️❤️ 本篇更新记录 2023-10-21 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…