设计模式(8):组合模式

news/2024/6/20 20:01:14/文章来源:https://blog.csdn.net/qq_25432245/article/details/137173988

一.组合模式场景

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

二.组合模式核心

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

三.组合模式工作流程分析

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

四.使用组合模式模拟杀毒软件

  • 1.抽象组件

/*** 抽象组件--抽象文件对象*/
public interface AbstractFile {/*** 杀毒*/void killVirus();
}
  • 2.叶子组件

/*** 查杀  图像文件*/
public class ImageFile implements AbstractFile{private String name;public ImageFile(String name) {this.name = name;}@Overridepublic void killVirus() {System.out.println("---图形文件:"+name+"  进行查杀!");}
}
/*** 查杀  文本文件*/
public class TextFile implements AbstractFile{private String name;public TextFile(String name) {this.name = name;}@Overridepublic void killVirus() {System.out.println("---文本文件:"+name+"  进行查杀!");}
}
/*** 查杀  视频文件*/
public class VideoFile implements AbstractFile{private String name;public VideoFile(String name) {this.name = name;}@Overridepublic void killVirus() {System.out.println("---视频文件:"+name+"  进行查杀!");}
}
  • 3.容器组件

/*** 容器组件--文件夹*/
class Foder implements AbstractFile{private String name;/*** 定义容器,用来存放本容器构建下的子节点*/private List<AbstractFile> list=new ArrayList<AbstractFile>();public Foder(String name) {this.name = name;}public void add(AbstractFile file){list.add(file);}public void remove(AbstractFile file){list.remove(file);}public AbstractFile getChild(int index){return list.get(index);}@Overridepublic void killVirus() {System.out.println("---文件夹:"+name+"  进行查杀!");for(AbstractFile file:list){file.killVirus();}}
}
  • 4.组合模式调用

public static void main(String[] args) {/*** 我的文件*    我的头像.jpg*    hello.text*    我的视频*   	神雕侠侣	*   	射雕英雄传*/AbstractFile f2,f3,f4,f5;Foder f1=new Foder("我的文件");f2=new ImageFile("  我的头像.jpg");f3 =new TextFile("  hello.text");f1.add(f2);f1.add(f3);Foder f6=new Foder("我的视频");f4=new VideoFile("  神雕侠侣");f5=new VideoFile("  射雕英雄传");f6.add(f4);f6.add(f5);f1.add(f6);f1.killVirus();System.out.println("-------------------------");f6.killVirus();}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式持续更新中…

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis高可用与持久化

目录 一、Redis高可用 二、Redis持久化 1、持久化的功能&#xff1a; 2、Redis 提供两种方式进行持久化&#xff1a; 三、RDB持久化 1、触发条件 1.手动触发 2.自动触发 3.其他自动触发机制 2、执行流程 3、启动时加载 四、AOF持久化 1、开启AOF 2、执行流程 1.…

深度学习入门简单实现一个神经网络

实现一个三层神经网络 引言测试数据 代码 引言 今天我们实现一个简单的神经网络 俩个输入神经元 隐藏层两个神经元 一个输出神经元 激活函数我们使用sigmoid 优化方法使用梯度下降 我们前期准备是需要把这些神经元的关系理清楚 x1&#xff1a;第一个输入 x2&#xff1a;第二个…

docker logs 查找日志常用命令

docker logs 是什么 docker logs 是 Docker 命令行工具提供的一个命令&#xff0c;用于查看容器的日志输出。它可以显示容器在运行过程中生成的标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;&#xff0c;帮助用户诊断容器的行为和排查…

Netty对Channel事件的处理以及空轮询Bug的解决

继续上一篇Netty文章&#xff0c;这篇文章主要分析Netty对Channel事件的处理以及空轮询Bug的解决 当Netty中采用循环处理事件和提交的任务时 由于此时我在客户端建立连接&#xff0c;此时服务端没有提交任何任务 此时select方法让Selector进入无休止的阻塞等待 此时selectCnt进…

了解与生成火焰图

目录 一、如何看懂火焰图 1、基本特征 2、基本分类 二、如何生成火焰图 1、捕获调用栈 2、折叠栈 3、转换为 svg 格式 4、展示 svg 一、如何看懂火焰图 1、基本特征 &#xff08;1&#xff09;纵轴&#xff1a;即每一列代表一个调用栈&#xff0c;每一个格子代表一个函…

聊聊CSS

css 的介绍 学习目标 能够知道css的作用 1. css 的定义 css(Cascading Style Sheet)层叠样式表&#xff0c;它是用来美化页面的一种语言。 没有使用css的效果图 使用css的效果图 2. css 的作用 美化界面, 比如: 设置标签文字大小、颜色、字体加粗等样式。 控制页面布局, 比如…

泰迪智能科技携手韶关学院共建实训基地

3月28日&#xff0c;韶关学院数学与统计学院院长宋杰、数学与统计学院副院长李少勇、数学与统计学院骨干教师邓四清、邝神芬、付林林莅临广东泰迪智能科技股份有限公司产教融合实训基地开展“韶关学院实习基地”揭牌仪式。泰迪智能科技高校事业部负责人施兴、培训业务部孙学镂、…

FastAPI Web框架教程 第3章 请求头和请求体

3.1 使用Header接收请求头参数 需求场景 假设现在我们有个图书网站&#xff0c;需要客户端在请求头上携带有效的token&#xff0c;才可以获取图书数据&#xff0c;那FastAPI该如何获取客户端传过来的请求头参数呢&#xff1f; FastAPI的解决方式 示例1&#xff1a;FastAPI获…

大话设计模式之观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;用于定义对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;其所有依赖者&#xff08;观察者&#xff09;都会收到通知并自动更新。 在观察者模式中&#xff0c;…

Spark-Scala语言实战(8)

在之前的文章中&#xff0c;我们学习了如何在spark中使用RDD方法的map,sortby,collect。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&…

Word的”交叉引用“和”插入题注“快捷键设置

Word的”交叉引用“和”插入题注“快捷键设置 在MSWord2021中&#xff0c;可以自定义设置快捷键。方法如下&#xff1a;文件-选项-自定义功能区-键盘快捷方式&#xff08;自定义&#xff09;。具体过程如图所示。 最后&#xff0c;按照上述流程将插入题注&#xff08;Insert…

成都直播基地出租:天府新区兴隆湖天府锋巢直播产业基地

天府新区兴隆湖天府锋巢直播产业基地&#xff0c;作为成都乃至西部地区的一颗璀璨明珠&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;吸引着越来越多的目光。这里不仅是成都直播产业的聚集地&#xff0c;更是传统企业转型升级的摇篮&#xff0c;是新媒体时代下的创新高…

【linux】线程的理论介绍

文章目录 一、线程概念1.1 Linux下的线程1.2 线程的优缺点 二、Linux下使用线程2.1 线程接口2.2 线程的TCB2.2.1 线程栈。2.2.2 线程的局部存储 三、线程互斥3.1 互斥的相关概念3.2 非互斥的问题3.3 互斥量&#xff08;互斥锁&#xff09;3.3.1 互斥量的接口3.3.2 加锁的注意事…

【面试经典150 | 动态规划】最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划方法二&#xff1a;空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

五、postman基础使用案例

postman基础使用 相关案例【传递查询参数】【提交表单数据】【提交JSON数据】 注&#xff1a;postman⼀款⽀持调试和测试的⼯具&#xff0c;开发、测试⼯程师都可以使⽤。方法一般统一为&#xff1a;方法→请求头→请求体→断言 相关案例 【传递查询参数】 访问TPshop搜索商品的…

MySQL开窗函数

测试环境&#xff1a;mysql8.0.18 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 一、窗口函数介绍二、语法结构三、自定义窗口1.rows&#xff08;重点&#xff09;2.range3.默认窗口 四、常用窗口函数示例1.row_number & rank &…

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法&#xff01;&#xff01;&#xff01;牢记…

Flink CDC 同步数据到Doris

Flink CDC 同步数据到Doris Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持了全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合 Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量…

【现代企业管理】企业组织结构和组织文化的理论与实践——以华为为例

一、前言 管理是科学和艺术的统一体&#xff0c;它是企业成长的保证。企业管理中&#xff0c;管理者面对的往往不是一个完整的系统&#xff0c;而是各种不具有整体规律性的零碎信息的总和&#xff0c;因此进行信息的整合和研究是管理的重点和关键。 组织管理作为管理的四大职…

OWASP API 安全风险,有哪些安全措施

随着互联网的快速发展&#xff0c;Web应用已成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;Web应用的安全问题也日益凸显&#xff0c;给企业和个人带来了极大的风险。 对于一些安全行业的用户来说&#xff0c;不少都听过关于OWASP这个词&#xff0c;很多用户想要…