03-JAVA设计模式-组合模式

news2024/12/23 10:47:31

组合模式

什么是组合模式

组合模式(Composite Pattern)允许你将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构,并且能像单独对象一样使用它们。

组合模式使用场景

把部分和整体的关系用树形结构来表示,从而是客户端可以使用统一的方式处理部分对象和整体对象。

组合模式核心

抽象构件(Component)角色:定义了叶子和容器构件的共同特点
叶子(Leaf)构件角色:无子节点
容器(Composite)构件角色:有容器特征,可以包含子节点

在这里插入图片描述

组合模式工作流程分析

  • 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,是的用户在使用是可以一致性的对待容器和叶子
  • 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也抱恨这个方法的成员,并调用执行,其中使用了递归调用的机制对整个结构进行处理。

代码实现结构

Component.java

// 抽象构件
public interface Component {
    // 相同行为操作
    void operation();
}

Leaf.java

// 叶子
public class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("叶子单独操作");
    }
}

Composite.java

import java.util.ArrayList;
import java.util.List;

// 容器节点
public class Composite implements Component{
    // 作为容器存储子节点信息
    private List<Component> components = new ArrayList<>();
    public Composite(List<Component> components) {
        this.components = components;
    }
    public List<Component> getComponents() {
        return components;
    }
    public void setComponents(List<Component> components) {
        this.components = components;
    }
    @Override
    public void operation() {
        System.out.println("容器构件操作");
        for (Component component : components) {
            // 递归执行叶子节点操作
            component.operation();
        }
    }
}

案例

模拟杀毒软件的架构设计

UML

在这里插入图片描述

实现代码

AbstractFile.java

// 抽象组件
public interface AbstractFile {
    // 杀毒功能
    void killVirus();
}

ImagesFile.java

// 图片类型文件
public class ImagesFile implements AbstractFile{
    private String name;

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

    @Override
    public void killVirus() {
        System.out.printf("图片类型文件-%s-进行扫毒%n",this.name);
    }
}

TxtFile.java

// 文本类型文件
public class TxtFile implements AbstractFile{
    private String name;
    public TxtFile(String name) {
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.printf("文本类型文件-%s-进行扫毒%n",this.name);
    }
}

VideoFile.java

// 视频类型文件
public class VideoFile implements AbstractFile{
    private String name;
    public VideoFile(String name) {
        this.name = name;
    }
    @Override
    public void killVirus() {
        System.out.printf("视频类型文件-%s-进行扫毒%n",this.name);
    }
}

Floder.java

import java.util.ArrayList;
import java.util.List;

// 容器构件:目录
public class Floder implements AbstractFile{
    private String name;
    // 子节点
    private List<AbstractFile> lists = new ArrayList<AbstractFile>();
    public Floder(String name, List<AbstractFile> lists) {
        this.name = name;
        this.lists = lists;
    }
    @Override
    public void killVirus() {
        System.out.printf("扫描当前目录-%s%n",this.name);
        for(AbstractFile abstractFile : lists){
            abstractFile.killVirus();
        }
    }
}

TestClient.java

import java.util.ArrayList;
import java.util.List;

public class TestClient {
    public static void main(String[] args) {
        AbstractFile file1 = new TxtFile("花无缺.TXT");
        AbstractFile file2 = new ImagesFile("花无缺.png");
        AbstractFile file3 = new ImagesFile("花无缺.avi");
        List<AbstractFile> list = new ArrayList<AbstractFile>();
        list.add(file1);
        list.add(file2);
        list.add(file3);
        Floder floder = new Floder("huawuque",list);

        AbstractFile file4 = new TxtFile("小鱼儿.TXT");
        AbstractFile file5 = new ImagesFile("小鱼儿.png");
        AbstractFile file6 = new ImagesFile("小鱼儿.avi");
        List<AbstractFile> list1 = new ArrayList<AbstractFile>();
        list1.add(file4);
        list1.add(file5);
        list1.add(file6);
        Floder floder2 = new Floder("xuaiyuer",list1);

        List<AbstractFile> list3 = new ArrayList<AbstractFile>();
        list3.add(floder);
        list3.add(floder2);

        Floder floder3 = new Floder("绝代双骄",list3);

        floder3.killVirus();
    }
}

执行结果

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

支持向量机模型pytorch

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个支持向量机模型pytorch程序,最后打印5个条件分别的影响力。 示例一 支持向量机&#xff08;SVM&#xff09;是一种…

企业网盘搭建——LNMP

php包链接&#xff1a;https://pan.baidu.com/s/1RElYTQx320pN6452N_7t1Q?pwdp8gs 提取码&#xff1a;p8gs 网盘源码包链接&#xff1a;https://pan.baidu.com/s/1BaYqwruka1P6h5wBBrLiBw?pwdwrzo 提取码&#xff1a;wrzo 目录 一.手动部署 二.自动部署 一.手动部署 …

Python pytest 面试题!

在Python软件开发中&#xff0c;单元测试是非常重要的一环。它可以帮助开发人员确保代码的正确性并提高代码质量。pytest是一个功能强大且易于使用的Python测试框架&#xff0c;它提供了丰富的功能和灵活的用法&#xff0c;使得编写和执行测试变得更简单和高效。 本文将介绍一…

如何把车卖出去,什么营销最靠谱!

之前我看过雷军的《小米创业思考》&#xff0c;在书中他一直在强调互联网思维&#xff0c;这是一种非常好的思考模式&#xff0c;不仅限于互联网产品&#xff0c;在这次卖车上也一样展现的淋漓尽致。 营销一样需要被设计。提到&#xff0c;不少设计师首先想到的是做运营海报&am…

pycharm连接hugging face等网站

一、设置环境变量 在代码最前面设置变量 os.environ[ALL_PROXY] http://127.0.0.1:7890 file-->setting 二、查看自己的代理ip 控制面板-网络和internet-internet选项-连接-局域网设置 1.控制面板 2. 网络和internet 3.internet选项 4.连接 5.局域网设置 6.IP

vue3大事件项目3

弹框验证 先准备变量: const formModel ref({ cate_name: , cate_alias: }) 还有规则&#xff1a; const rules { cate_name: [ { required: true, message: please input name, trigger: blur }, { pattern: /^\S{1,10}$/, message: must be 1-10, trigger: blur } ], …

windows下使用nginx设置静态资源路由

1、下载nginx http://nginx.org/en/download.html 下载稳定版本&#xff0c;以nginx/Windows-1.24.0为例&#xff0c;下载后解压&#xff0c;解压后如下&#xff1a; 2、启动nginx 打开cmd命令窗口&#xff0c;切换到nginx解压目录下&#xff1a; start nginx # 启动nginx服务…

浮点数表示的数值范围详解(一)

学生问了一个问题&#xff1a; 这个问题如果想讲明白&#xff0c;需要将基础知识复习一下。 一、定点数 1、什么是定点数&#xff1f; 定点数指小数点在数中位置固定不变的数。 详细解释&#xff1a;计算机中小数点的位置固定不变&#xff0c;小数点前、后的数字&#xff…

一种动态防御策略——移动目标防御(MTD)

文章速览&#xff1a; 1、高级规避攻击 2、用移动目标防御对抗欺骗 常见做法操作系统和应用程序才是真正的战场打破游戏规则 网络攻击的技术变得愈发难测&#xff0c;网络攻击者用多态性、混淆、加密和自我修改乔装他们的恶意软件&#xff0c;以此逃避防御性的检测&#xf…

正基塑业邀您参观2024长三角快递物流供应链与技术装备展览会

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展新能源商用车及物流车展 电商物流包装展 冷链物流展 展会介绍 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09;&#xff0c;于2024年7月8-10日在杭州…

机器学习中的激活函数

激活函数存在的意义&#xff1a; 激活函数决定了某个神经元是否被激活&#xff0c;当这个神经元接收到的信息是有用或无用的时候&#xff0c;激活函数决定了对这个神经元接收到的信息是留下还是抛弃。如果不加激活函数&#xff0c;神经元仅仅做线性变换&#xff0c;那么该神经网…

【C++】priority_queuepriority_queue模拟实现

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. priority_queue的介绍2. priority_queue的使用3. 函数模板与类模板4. 仿函数5. priority_queue模拟实现5.1 push5.2 pop5.3 empty5.4 size5.5 top5.6 仿函数实现大小堆5.7 实现自定义类型的优先级队列 6. 附模拟实…

Linux的启动过程,了解一下?

Linux 系统启动过程 linux启动时我们会看到许多启动信息。 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 内核的引导。运行 init。系统初始化。建立终端 。用户登录系统。 init程序的类型&#xff1a; SysV: init, CentO…

Linux系统编程开发环境搭建

开发环境搭建 桥接网络&#xff08;Bridged Network&#xff09;、网络地址转换&#xff08;NAT, Network Address Translation&#xff09;和主机模式网络&#xff08;Host-only Networking&#xff09; 在虚拟化环境中&#xff0c;常见的三种网络模式是桥接网络&#xff08…

好用的Python开发工具合集

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

OpenHarmony开发实例:【鸿蒙.bin文件烧录】

使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板 鸿蒙官方文档的“Hi3861开发板第一个示例程序”中描述了——如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板&#xff1b; 本文将介绍如何使用HiBurn工具烧录鸿蒙的.bin文件到Hi3861开发板。 获取HiBurn工具 通过鸿蒙…

云仓酒庄品酒师培训破大世界基尼斯纪录,市场专业化趋势势如破竹

近日&#xff0c;云仓酒庄举办的品酒师培训活动成功创下大世界基尼斯纪录&#xff0c;这一荣誉不仅彰显了云仓酒庄在酒类培训领域的专业实力&#xff0c;更折射出酒类市场专业化趋势的势如破竹。随着酒类市场的日益成熟和消费者品鉴需求的提升&#xff0c;酒类市场专业化趋势对…

通义千问:官方开放API开发基础

目录 一、模型介绍 1.1主要模型 1.2 计费单价 二、前置条件 2.1 开通DashScope并创建API-KEY 2.2 设置API-KEY 三、基于DashScope SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 通义千问是由阿里云自主研发的大语言模型&#xff0c;用于理解和分…

Vitis HLS 学习笔记--BLAS库之WideType

目录 1. WideType 数据类型 2. WideType 类模板参数 2.1 SFINAE技术 3. WideType 类中的函数 3.1 operator[](unsigned int p_Idx) 3.2 operator(const WideType& p_w) const 3.3 getValAddr() 3.4 operator const t_TypeInt() 4. 总结 1. WideType 数据类型 在 …

Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码

Javasaas模式 智慧校园系统源码Java Android MySQL IDEA 多校运营数字化校园云平台源码 智慧校园即智慧化的校园&#xff0c;也指按智慧化标准进行的校园建设&#xff0c;按标准《智慧校园总体框架》中对智慧校园的标准定义是&#xff1a;物理空间和信息空间的有机衔接&#…