当前位置: 首页 > article >正文

结构型模式--组合模式

概念

组合人模式是结构型设计模式的一种,主要是用于解决代码中出现类像树一样进行组合而出现的组合结构的相关操作问题。使其树中的任意一个节点(无论是子节点还是父节点)都可以使用同一套接口进行操作。

使用场景

1、如果希望我们对象组合像树一样,就可以使用组合模式

2、客户端的代码需要以相同的方式处理复杂或者简单的元素(组合对象或者单个对象),可以使用组合模式。

实现方式

1、创建一个可以组成树状结构的核心模型(抽象接口类)。尝试将其分解为简单的元素和容器,容器必须能够同时包含简单元素和其他容器。

2、声明组件接口及其一系列的方法,这些方法对简单和复杂元素都有意义。

3、创建一个叶节点类的表示元素。

4、创建一个容器类表示复杂元素,在该类中,创建一个数组成员变量来存储对于子元素的引用,该数组必须能够同时保持叶节点和容器,因此请确保将其声明为组合接口类型。

5、最后,容器中定义添加和删除子元素的方法。

类组合结构

在这里插入图片描述

示例代码

#include <iostream>
#include "ZuHeMoshi.h"

int main()
{
    std::cout << "欢迎东哥来到设计模式的世界!\n";
    //创建叶子节点
    Leaf leaf1;
    leaf1.setTime(2);
    Leaf leaf2;
    leaf2.setTime(2);
    Leaf leaf3;
    leaf3.setTime(2);
    Leaf leaf4;
    leaf4.setTime(2);

    AbstractBase* container1 = new Container();
    container1->addAbstractBase(&leaf1);
    container1->addAbstractBase(&leaf2);

    cout << "container1 time : " << container1->allTime() << endl;

    AbstractBase* container2 = new Container();
    container2->addAbstractBase(&leaf3);
    container2->addAbstractBase(&leaf4);
    container2->addAbstractBase(container1);

    cout << "container2 time : " << container2->allTime() << endl;
}
#pragma once
#include <vector>
using namespace std;
class AbstractBase
{
public:
	AbstractBase() {}
	~AbstractBase() {}
	virtual void addAbstractBase(AbstractBase* abstractBase) {};
	virtual int allTime() { return 0; };//计算所有时间,假设代码中这是需要计算组合或者单个元素的运行时间的函数
	int m_time;
};

class Leaf : public AbstractBase
{
public:
	Leaf() {}
	~Leaf() {}
	int allTime();
	void setTime(int time) {
		m_time = time;
	}
private:
	int m_time;
};

class Container : public AbstractBase
{
public:
	Container() {}
	~Container() {}
	void addAbstractBase(AbstractBase* abstractBase);//暂时就写个添加
	int allTime();
private:
	vector<AbstractBase*> m_vAbstractBase;
};
#include "ZuHeMoshi.h"

int Leaf::allTime()
{
    return m_time;
}

void Container::addAbstractBase(AbstractBase* abstractBase)
{
    m_vAbstractBase.push_back(abstractBase);
}

int Container::allTime()
{
    int sun = 0;
    for (AbstractBase* base : m_vAbstractBase) {
        sun += base->allTime();
    }
    return sun;
}

http://www.kler.cn/a/565088.html

相关文章:

  • 蓝桥备赛(三)- 条件判断与循环(下)
  • 算法仿真平台搭建1-FFMPEG+RtspSever快速搭建一个RTSP服务器
  • 去耦电容的作用详解
  • LlamaFactory-webui:训练大语言模型的入门级教程
  • IP离线库助力破解网络反诈难题
  • Deepseek的缺陷
  • (一)未来学习什么语言或相关的AI、数据库知识进行技术迭代提升?
  • 利用阿里云容器镜像服务创建免费的国内镜像节点
  • Linux实操——在服务器上直接从百度网盘下载(/上传)文件
  • 蓝桥杯好题推荐--多项式输出
  • 第6天:指针与内存管理
  • 【笔记】论文阅读方法(AI大模型)
  • 网络原理--UDP的特点
  • USBCANFD接口卡介绍
  • Python在实际工作中的运用-合并XLSX表格的新方法
  • vue3中ref和reactive响应式数据、ref模板引用(组合式和选项式区别)、组件ref的使用
  • 自动化问题汇总
  • XSS-labs靶场通关
  • Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)
  • MySQL分库分表之带来查询相关问题