组合模式是指将一组相似对象当做一个单一对象的设计模式.

1.组成角色:

1.1组件:

组合中的对象声明接口,主要用于访问和管理其子组件.

1.2叶子节点:

定义组合中原始对象行为的类.叶子节点表示组合中的叶对象.

1.3组合:

又称为容器,存储子组件并在组件接口中实现与子组件有关的类.

1.4客户端:

客户端可以通过组件接口操作组合中的对象.以及与树形结构中的所有项目交互.

2.使用场景:

2.1需要忽略组合对象和单个对象之间差异时.

2.2需要实现树形结构时.

2.3客户端以统一的方式处理简单或复杂的元素.

3.实现:

3.1组件接口:
// 组件接口
type Component interface {Execute()
}
3.2叶节点类:
// 叶子节点类
type Leaf struct {value int
}// 创建一个新的叶节点对象
func NewLeaf(value int) *Leaf {return &Leaf{value: value}
}// 打印叶节点的值
func (l *Leaf) Execute() {fmt.Println(l.value)
}
3.3组合类:
// 组合类
type Composite struct {children []Component
}// 创建一个新的组合对象
func NewComposite() *Composite {return &Composite{make([]Component, 0)}
}
3.4组合类中添加方法:
// 添加方法
func (c *Composite) Add(component Component) {c.children = append(c.children, component)
}func (c *Composite) Execute() {for _, child := range c.children {child.Execute()}
}
3.5客户端:
func main() {composite := itboStudy.NewComposite()leaf := itboStudy.NewLeaf(99)leaf1 := itboStudy.NewLeaf(88)leaf2 := itboStudy.NewLeaf(77)composite.Add(leaf)composite.Add(leaf1)composite.Add(leaf2)composite.Execute()
}

4.实战:

4.1叶子节点:
// 叶子节点类
type Files struct {Name string
}func (f *Files) Search(name string) {fmt.Printf("在文件%s中递归搜索%s", f.Name, name)
}func (f *Files) GetName() string {return f.Name
}
4.2组合类:
// 定义组合类.
type Folders struct {Compents []ComponentsName     string
}func (f *Folders) Search(name string) {fmt.Printf("在文件%s中递归搜索%s", f.Name, name)for i := range f.Compents {f.Compents[i].Search(name)}
}func (f *Folders) Add(c Components) {f.Compents = append(f.Compents, c)
}
4.3组件接口:
// 定义组件接口
type Components interface {Search(name string)
}
4.4客户端:
func main() {file1 := &itboStudy.Files{Name: "itboStudy1"}file2 := &itboStudy.Files{Name: "itboStudy2"}file3 := &itboStudy.Files{Name: "itboStudy3"}folders := &itboStudy.Folders{Name: "itboFolder"}folders.Add(file1)folders.Add(file2)folders.Add(file3)folders.Search("99")
}

5.优点:

无须了解构成树形结构的对象具体类,只需要调用接口方法.

客户端可以使用组件对象与复合结构中的对象进行交互.

如果调用的是叶子节点对象,可以直接处理请求.

如果调用的组合对象,组合模式会把请求转发给子组件.

6.缺点:

一旦定义了树结构,设计会过于笼统.

组合模式很难将树的组件限制为特定类型.

为了强制执行这种约束,程序必须依赖运行时检查.组合模式不能使用编程语言的类型系统.

士别三日当刮目相待.

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

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

相关文章

AI 3D 生成工具知识库:当前产品格局与测评总结

聚焦于 AI 3D 生成领域的领军产品、功能比较及实测性能。内容分为产品格局、通用功能、测评系统与基准测试,以及单视图生成实测结果。所有信息基于脚本分析,并交叉验证了产品名称、团队背景(如 VAST AI 的 TripoSR/Meshy 的 Meshy-1、影眸科技…

淘客app的容器化部署与编排:基于Kubernetes的微服务架构实践

淘客app的容器化部署与编排:基于Kubernetes的微服务架构实践 大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿! 在淘客app的业务迭代中,传统物理机部署面…

当GitHub不再纯粹:Python自动化测试的未来是AI还是危机?

全球最大的开源代码平台,彻底被卷进了AI洪流!作为全球最大的“程序员交友平台”(手动狗头),GitHub 可以说是每一个开发者又爱又恨的“家”。没错,就是那个全球最大、没有之一的开源代码托管平台&#xff01…

Spring Boot + MySQL 创建超级管理员

Spring Boot系统创建超管实现方式1. 数据库脚本初始化(最直接的方式)2. Spring Boot 启动时自动创建(代码级初始化)2.1 实体类定义2.2 Repository 接口2.3 初始化组件2.4 配置密码加密器3. 通过接口手动创建(最安全的方…

杨辉三角**

一、题目给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。示例 1:输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows 1 输出: [[1]]提示:1 <…

Vue3 的单文件组件(.vue 文件)中,在 <script>、<template>、<style> 标签外输入内容不会导致程序报错

在 <script>、<template>、<style> 标签外首行误输入内容 vtsvts <script setup lang"ts" name"BaseDocxPreviewDialog"> /*** docx文件预览模态框组件*/ defineOptions({ name: "BaseDocxPreviewDialog" }); import { …

LVS负载均衡群集和LVS+Keepalived群集

1、群集 1.1群集的含义 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与IP地址&#xff09;&#xff0c;相当于一台大型计算机。 1.2 企业群集分类 负载均衡群集&#xff1a;提高应用系统的响应能力、尽可能处理更多的…

LeetCode力扣-hot100系列(5)

这一篇主要讲一讲回溯&#xff0c;除了N皇后问题是困难题&#xff0c;不过N皇后知道了咋做也不难。回溯整体上还是好做的&#xff0c;直到套路容易做出来&#xff0c;题目容易理解。回溯[1]全排列问&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的…

机器学习05——多分类学习与类别不平衡(一对一、一对其余、多对多)

上一章&#xff1a;机器学习04——决策树 下一章&#xff1a;机器学习06——支持向量机 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、多分类学习&#xff08;一&#xff09;…

2025.9.11总结

阅读《拿铁因素》有感昨天看完《拿铁因素》&#xff0c;这本书让我明白&#xff0c;如果不去主动去管理自己的财务&#xff0c;解决自己从前的财务问题&#xff0c;我很难过上自己想要的生活。今天就所读的内容&#xff0c;探究如何将这本书的内容运用到自己的一个日常生活中。…

Android,Jetpack Compose,坦克大战游戏案例Demo

代码如下&#xff08;这只是个简单案例而已&#xff09;&#xff1a; package com.example.myapplicationimport android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Canvas impo…

zookeeper是啥

ZooKeeper是一个开源的分布式协调服务&#xff0c;主要用于解决分布式系统中的数据一致性、状态同步和协作问题‌。它通过提供高可用、强一致性的服务&#xff0c;成为分布式系统的“指挥中心”‌。以下是其核心功能和应用场景&#xff1a;核心功能 分布式同步‌ 通过原子广播协…

【开题答辩全过程】以 基于Android的智慧旅游APP开发为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

如何选择?SEO 与 GEO 的 5 个核心分野

在 30 秒内&#xff0c;以下是您需要了解的有关 SEO 和 GEO 之间差异的信息&#xff1a; SEO&#xff08;搜索引擎优化&#xff09;&#xff1a;让您的网站出现在 Google 搜索中。目标&#xff1a;吸引用户点击您的链接。GEO&#xff08;生成引擎优化&#xff09;&#xff1a;…

基于MATLAB的光学CCD全息成像仿真程序实现

基于MATLAB的光学CCD全息成像仿真程序实现一、流程 #mermaid-svg-g3dkhZSC3Go4a2kH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-g3dkhZSC3Go4a2kH .error-icon{fill:#552222;}#mermaid-svg-g3dkhZSC3Go4a2kH .er…

Java大厂面试实录:产业互联网大数据与AI服务场景下的微服务与智能搜索(含详细解读)

Java大厂面试实录&#xff1a;产业互联网大数据与AI服务场景下的微服务与智能搜索&#xff08;含详细解读&#xff09; 场景开场 &#x1f3ed;&#x1f984; 午后阳光正好&#xff0c;王老登背着“Java一把梭”的背包&#xff0c;精神抖擞地走进了产业互联网大数据与AI服务大厂…

Win_Server远程桌面(RDP)服务调用GPU并提上传输帧率和USB设备重定向

说明&#xff1a;Windows远程桌面服务&#xff08; RDP &#xff09;&#xff0c;RDP服务是可以无显卡运行的&#xff0c;显示远程桌面的时候并不调用显卡&#xff0c;可以做一些基本的管理操作&#xff0c;为提升RDP的性能&#xff0c;可以开启显卡加速&#xff08; OpenGL&am…

Docker(⑤Kali Linux-HexStrike AI安装)

卸载 WSL 里的 Ubuntuwsl --unregister Ubuntu查看当前已安装的发行版wsl --list --verbose下载kali-linuxwsl --install -d kali-linuxKali 服务端安装sudo apt update && sudo apt upgrade -y sudo apt install python3 python3-venv python3-pip git -y克隆源码 &am…

查找算法和递推算法

查找算法题目 1&#xff1a;找班级里的 “小明星”题目描述&#xff1a;班级有 10 个同学的编号&#xff08;1 - 10&#xff09;&#xff0c;输入一个编号&#xff0c;判断是否是 “小明星”&#xff08;假设编号为 5 的是小明星&#xff09;&#xff0c;是就输出 “找到小明星…

2025 年PT展前瞻:人工智能+如何走进普通人的生活?

导读&#xff1a;2025年&#xff0c;人工智能正在加速融入日常生活&#xff0c;提升着每一个普通人的幸福感与获得感。清晨&#xff0c;智能手环在你最浅的睡眠阶段轻柔震动&#xff0c;用最科学的方式将你唤醒&#xff1b;通勤路上&#xff0c;智能网联汽车早已规划好躲避拥堵…