模式定义

  • 又称整体-部分模式
组合多个对象形成 树形结构 以表示“整体-部分”的结构层次
  • 组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性
  • 对象结构型模式

模式结构

  • Component:抽象构件
  • Leaf:叶子构件
  • Composite:容器构件
  • Client:客户类

组合模式定义了一个抽象构件类,它既可以代表叶子,又可以代表容器

  • 客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理
  • 容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构
  • Component定义如果只包含operation函数,则称为安全组合模式,否则称为透明组合模式

抽象构件角色代码

public abstract class Component {public abstract void add(Component c);public abstract void remove(Component c);public abstract Component getChild(int i);public abstract void operation();}

叶子构件角色代码

public class Leaf extends Component {public void add(Component c) {//异常处理或错误提示}public void remove(Component c) {//异常处理或错误提示}public Component getChild(int i) {//异常处理或错误提示}public void operation() {//实现代码} }

容器构件角色代码

public class Composite extends Component {private ArrayList list = new ArrayList();public void add(Component c) {list.add(c);}public void remove(Component c) {list.remove(c);}public Component getChild(int i) {(Component)list.get(i);}public void operation() {for(Object obj:list) {((Component)obj).operation();}}}

扩展组合模式

透明组合模式

Component定义包含operation函数和其他工具函数

安全组合模式

Component定义只包含operation函数

实例

实例一:文件系统

实例二:水果盘

在水果盘(Plate)中有一些水果,如苹果(Apple)、香蕉(Banana)、梨子(Pear),当然大水果盘中还可以有小水果盘,现需要对盘中的水果进行遍历(吃),当然如果对一个水果盘执行“吃”方法,实际上就是吃其中的水果。使用组合模式模拟该场景。

模式分析

  • 优点
    • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易
    • 客户端调用简单,客户端可以一致的使用组合结构或其中单个对象
    • 定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构
    • 更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码
  • 缺点
    • 使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象子类都有关联
    • 增加新构件时可能会产生一些问题,很难对容器中的构件类型进行限制

适用环境

  • 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们
  • 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节
  • 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们

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

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

相关文章

商代大模型:智能重构下的文明曙光与青铜密码

引言:技术奇点的历史想象 在人类文明的长河中,技术的进步始终是推动社会变革的核心动力。从青铜冶炼到文字发明,从农业革命到工业革命,每一次技术飞跃都重塑了人类对世界的认知与生存方式。而如今,人工智能的崛起正以…

【Python】python系列之函数作用域

Python 系列文章学习记录: Python系列之Windows环境安装配置_开着拖拉机回家的博客-CSDN博客 Python系列之变量和运算符_开着拖拉机回家的博客-CSDN博客 Python系列之判断和循环_开着拖拉机回家的博客-CSDN博客 Python系列之字符串和列表_开着拖拉机回家的博客…

Unity UI 核心类解析之Graphic

🧱 Unity UI 核心类解析:Graphic 类详解 一、什么是 Graphic? 在 Unity 的 UI 系统中,Graphic 是一个抽象基类,继承自 UIBehaviour 并实现了 ICanvasElement 接口。它是所有可以被绘制到屏幕上的 UI 元素的基础类。 …

【Elasticsearch】文档迁移(Reindex)

文档迁移 1.为什么要进行 reindex 操作2.Reindex 操作的本质3.实际案例3.1 同集群索引之间的全量数据迁移3.2 同集群索引之间基于特定条件的数据迁移3.2.1 源索引设置检索条件3.2.2 基于 script 脚本的索引迁移3.2.3 基于预处理管道的数据迁移 3.3 不同集群之间的索引迁移3.4 查…

WordPress 区块版面配置指南

WordPress 的区块编辑器(Gutenberg)提供了灵活的版面配置选项,以下是主要配置方法: 基本区块布局 添加区块:点击””按钮或按”/”键快速插入区块 常用内容区块: 段落(Paragraph) 标题(Heading) 图像(Image) 画廊(Gallery)…

TensorFlow基础之理解张量

2.理解张量 张量(Tensors)介绍 张量是物理和工程领域的基础数学结构。但是过去张量很少在计算机科学里使用。它与离散数学和逻辑学有更多的联系。随着机器学习的出现,这种状态开始显著的改变,成为连续向量的计算基础。现代机器学…

Flume 安装与配置步骤

1.解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz 2.配置环境变量 vim /etc/profile export FLUME_HOME/home/wang/soft/flume/apache-flume-1.9.0-bin export PATH$PATH:$FLUME_HOME/bin source /etc/profile 3.创建必要的目录 mkdir -p $FLUME_HOME/conf 4.创建 Flume 配置文…

还原线上 WebView 异常:手机端APP远程调试

前端调试总被理解为开发阶段的事,但在实际项目中,真正困难的调试往往发生在产品上线之后。用户反馈“看不到内容”、“一直转圈”、“点了没反应”,而开发环境无法复现,测试机也正常运行,这时怎么定位、验证和解决问题…

102页满分PPT | 汽车设备制造业企业信息化业务解决方案智能制造汽车黑灯工厂解决方案

这份文档是一份汽车设备制造业企业信息化业务解决方案,详细阐述了企业从生产到销售的全流程信息化建设。针对企业目前手工管理为主、信息化程度低、数据追溯困难等问题,提出了建立统一信息化平台的目标,涵盖财务、业务、流程和数据的整合。方…

SQLite 表达式详解

SQLite 表达式详解 引言 SQLite 是一个轻量级的数据库,广泛用于移动设备和桌面应用程序。SQLite 的表达式是 SQL 语句的核心,它们用于查询、更新和删除数据库中的数据。本文将详细解释 SQLite 的各种表达式,并探讨它们在数据库操作中的重要性。 表达式概述 在 SQLite 中…

沉浸式AI交互数字人技术解析

360智汇云沉浸式AI交互数字人支持开发者灵活接入和私有化部署大模型服务,构建面向业务场景的实时音视频交互能力。系统集成了360智汇云自研的沉浸式AI交互数字人引擎与高性能 RTC 模块,保障音视频传输过程中的低延迟、高稳定性和高并发承载能力&#xff…

HarmonyOS 评论回复弹窗最佳实践

HarmonyOS 评论回复弹窗最佳实践 前言 在移动应用开发中,评论回复功能是一个常见且重要的交互场景。本文将详细介绍如何在 HarmonyOS 中实现一个功能完善的评论回复弹窗,包括弹窗选型、富文本编辑、软键盘适配等关键技术点。 功能概述 我们要实现的评…

Git 回退操作详解:带示例的“小白”指南

前言 在日常开发中,我们难免会遇到: 改错代码:推送之前才发现某些行根本就不该动提交错误:commit 信息打错、提交到错误分支想回到之前版本:测试时发现之前版本是好的,需要回去查看 这就需要用到 Git 的…

redux以及react-redux

1.redux案例完整版 上一篇文章我们是没有action文件,直接在countre组件与store以及reducer直接进行状态的改变以及展示。 下面我们加上action文件,我们就不能直接通过dispatch传,而是通过调用action里面的函数讲我们传入的参数变成action这种…

idea中配置svn及提交提示“未检测到更改”提示

首先要安装TortoiseSVN,选command line client tools; 在idea中,文件->设置->Subversion->如下图 文件->设置->目录映射->如下图 初次导入到svn, 输入服务器上的svn地址,等待成功即可;…

vue 实现dot-dropdown

<template><div class"app-container"><div class"mt30"></div><el-row :gutter"20"><!-- title --><!-- <div class"modt-box">导航管理</div> --><el-col :span"2&q…

使用 mysql2/promise 模块返回以后,使用 await 返回数据总结

SELECT 返回结构 const [rows, fields] await db.query(SELECT * FROM folders);返回&#xff1a; rows: 是一个数组&#xff0c;包含所有查到的记录。fields: 是字段的结构定义&#xff08;列信息&#xff09;&#xff0c;一般不用。 rows 是一个数组&#xff0c;包含所有…

Manus Metagloves pro高精度+无漂移+低延迟 ,重构VR/XR手部交互方式

manus metagloves pro是一款专为动画制作、虚拟现实及游戏开发打造的高精度无线动作捕捉手套。采用先进的Quantum追踪技术&#xff0c;实现毫米级动作捕捉&#xff0c;精准还原手指细节&#xff0c;显著提升创作效率与交互真实感。 MANUS Metagloves Pro解锁动捕 / 机器人 / XR…

Uniapp插件改造指南:如何让vue-plugin支持HarmonyOS5原生能力?

一、分层架构设计 采用通用逻辑与平台实现分离的三层结构&#xff1a; uni-plugin-harmony ├── common # 跨平台通用层 │ ├── interfaces # 能力接口抽象&#xff08;如Scanner.ets&#xff09; │ └── utils # 工具类 ├── harmony …

P1040 [NOIP 2003 提高组] 加分二叉树 题解

题目描述 设一个 n n n 个节点的二叉树 tree \text{tree} tree 的中序遍历为 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n)&#xff0c;每个节点都有一个分数&#xff08;均为正整数&#xff09;。任一棵子树 subtree \text{subtree} subtree&#xff08;包含 tr…