C++设计模式-组合(Composite)

news2024/11/19 5:31:32

目录

C++设计模式-组合(Composite)

一、意图

二、适用性

三、结构

四、参与者

五、代码


C++设计模式-组合(Composite)

一、意图

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

二、适用性

  • 你想表示对象的部分-整体层次结构。
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

三、结构

 

四、参与者

  • Component

        为组合中的对象声明接口。

        在适当的情况下,实现所有类共有接口的缺省行为。

        声明一个接口用于访问和管理Component的子组件。

        (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

  • Leaf

        在组合中表示叶节点对象,叶节点没有子节点。

        在组合中定义图元对象的行为。

  • Composite

        定义有子部件的那些部件的行为。

        存储子部件。

        在Component接口中实现与子部件有关的操作。

  • Client

        通过Component接口操纵组合部件的对象。

五、代码

#include<iostream>
#include<list>
using namespace std;

class Component {
public:
	virtual void Operation() {}
	virtual void Add(Component* tempComponent) {}
	virtual void Remove(Component* tempComponent) {}
	virtual Component* GetChild(int i) { return 0; }
};

class Composite : public Component {
public:
	void Operation() {
		for (auto i : componentList) {
			i->Operation();
		}
	}
	void Add(Component* tempComponent) {
		componentList.push_back(tempComponent);
	}
	void Remove(Component* tempComponent) {
		componentList.remove(tempComponent);
	}
	Component* GetChild(int i) {
		list<Component*>::iterator it = componentList.begin();
		advance(it, i);
		return *it;
	}
private:
	list<Component*> componentList;
};

class Leaf : public Component {
public:
	Leaf(string tempName):name(tempName) {}
	void Operation() {
		cout << "Name : " << this->name << endl;
	}
private:
	string name;
};

int main() {

	Component* p = new Composite();
	p->Add(new Leaf("111"));
	p->Add(new Leaf("222"));

	p->GetChild(1)->Operation();
	p->Operation();
	return 0;
}

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

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

相关文章

stm32之手动创建keil工程--HAL库

用CubeMx创建了好多stm32的工程&#xff0c;这里记录下手动创建keil工程的过程。 一、准备工作 1.1、下载对应的HAL库&#xff0c; 这里使用的是stm32f103c8t6, 下载地址stm32HAL库 在页面中输入对应型号点击进行二级页面进行下载 1.2、准备工程 各文件夹下具体操作如下&am…

Qt之QDial(表盘)

简介 QDial类提供了一个四舍五入的范围控制&#xff08;如速度计或电位计&#xff09;&#xff0c;非常适合需要循环计数的情况&#xff0c;例如角度等。 头文件&#xff1a;#include <QDial> qmake&#xff1a;QT widgets 继承&#xff1a;QAbstractSlider …

在WIN10平台上体验Microsoft古老的Quick C 1.0编程

前言&#xff1a; 90年代初&#xff0c;微软出了Quick系统对抗Borland Turbo系列&#xff0c;其中包括 QuickBasic, QuickPascal和Quick C。1991年&#xff0c;Quick C for Windows 1.0发布&#xff0c;后来它被Visual C取代。我自己觉得微软成就在那个winstub.exe桩上&#xf…

连接虚拟机工具推荐

连接虚拟机工具推荐 连接虚拟机的工具有很多种&#xff0c;以下是一些常用的推荐&#xff1a; PuTTY&#xff1a;这是一个非常常用的SSH和telnet客户端&#xff0c;适用于Windows系统。它允许你在本地机器上通过命令行接口远程登录到虚拟机。 SecureCRT&#xff1a;这是一个支…

vscode 配置自定义code snippets 来快速生成你的常用代码

一、功能介绍 什么是 snippets 功能&#xff1f; 其实大家可能体验过vscode 预先内置的许多 snippets, 比如 for 循环。 在输入 for Tab 的时候&#xff0c;就可以自动生成代码模版&#xff0c; 展开就是这样的代码 有一个小窍门是通过 tab 键可以在参数之间进行跳转&#xf…

力扣 -- 1745. 分割回文串 IV

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool checkPartitioning(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));for(int in-1;i>0;i--){for(int ji;j<n;j){if(s[i]s[j]){dp[i][j]i1<j?dp[i…

【C++设计模式之观察者模式:行为型】分析及示例

简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都能够自动收到通知并更新。 描述 观察者模式由两个核心件组成&#xff1…

抄写Linux源码(Day18:读取硬盘前的准备工作有哪些?)

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

[论文精读]U-Net: Convolutional Networks for BiomedicalImage Segmentation

论文原文&#xff1a;U-Net: Convolutional Networks for Biomedical Image Segmentation (arxiv.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔…

[笔记] Windows内核课程:保护模式《二》段寄存器介绍

文章目录 前言1、什么是段寄存器? 有哪些 ?2. 段寄存器的结构 前言 段寄存器&#xff0c;页寄存器 1、什么是段寄存器? 有哪些 ? 当我们用汇编读写某一个地址时: mov dword ptr ds:[0x123456],eax我们真正读写的地址是: ds.base 0x123456ES、CS、SS、DS、FS、GS、LDTR…

Linux和Hadoop的学习

目录 1. Linux的常用快捷键2. Hadoop集群部署问题汇总 1. Linux的常用快捷键 复制&#xff1a;CtrlshiftC 粘贴&#xff1a;CtrlshiftV TAB&#xff1a;补全命令 编写输入&#xff1a;i 退出编写&#xff1a;esc 保存并退出&#xff1a;shift&#xff1a; 2. Hadoop集群部署问…

网络安全(黑客)从零开始的自学指南(第一章)

第一章&#xff1a;网络安全概述 1.1 什么是网络安全 网络安全是指保护计算机网络系统和网络中的数据免受未经授权的访问、使用、破坏、篡改或泄露的一系列措施和技术。随着互联网的普及和信息化的发展&#xff0c;网络安全问题日益突出&#xff0c;对个人、组织和国家的安全…

电影大师杂记

假期集中刷了好多书&#xff0c;游戏和电影&#xff0c;在虚拟世界里猛烈的各种闲逛&#xff0c;cyberpunk 2077到blade runner&#xff0c;到异形&#xff0c;到终结者&#xff0c;到星球大战&环太平洋&#xff0c;到工业光魔&#xff0c;还有各种编程的书。。。 hmmm&…

Kali镜像

镜像地址 Index of /kali-images/http://old.kali.org/kali-images/

C++设计模式-装饰器(Decorator)

目录 C设计模式-装饰器&#xff08;Decorator&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-装饰器&#xff08;Decorator&#xff09; 一、意图 动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;Decorator模式相比生成子…

【推荐系统】wss课程-重排序

MMR marginal 边缘的&#xff1b; i已选中&#xff0c;j 未选中。注意&#xff01;j 是很多物品。 每一轮的 S 都会发生变化&#xff0c;所以每轮的 MRi都要重新计算。 - 每轮都从未选中的物品中与已选中的物品计算 MR&#xff0c;把分数最高的 i 从 R 中移出来。 目标&am…

Uvc Usb Camera 调节亮度无效问题,搞定

Uvc Usb Camera无法正常调节亮度的问题&#xff0c;搁置了也有好长一段时间了。假期期间&#xff0c;下定决心要排查下&#xff0c;搞定才行。 然后折腾了下&#xff0c;跟踪了下代码流程&#xff0c;添加了些日志,debug了下。 最后发现在下图位置&#xff0c;有个判断条件&…

基于SpringBoot的民宿在线预定平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 民宿信息管理 民宿资讯管理 民宿分类管理 用户注册 民宿信息 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

C# 图解教程 第5版 —— 第1章 C# 和 .NET 框架

文章目录 1.1 在 .NET 之前1.2 .NET 时代1.2.1 .NET 框架的组成1.2.2 大大改进的编程环境 1.3 编译成 CIL1.4 编译成本机代码并执行1.5 CLR1.6 CLI1.7 各种缩写1.8 C# 的演化1.9 C# 和 Windows 的演化&#xff08;*&#xff09; 1.1 在 .NET 之前 MFC&#xff08;Microsoft Fou…

Golang网络编程:即时通讯系统Instance Messaging System

系统基本架构 版本迭代 项目改造 无人机是client&#xff0c;我们是server&#xff0c;提供注册登入&#xff0c;场景选择等。信道模拟器是server&#xff0c;我们是client&#xff0c;我们向信道模拟器发送数据&#xff0c;等待信道模拟器计算结果&#xff0c;返回给无人机。…