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

结构型模式--组合模式

概念

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

使用场景

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;
}

相关文章:

  • 如何在 UniApp 中集成激励奖励(流量主)
  • 3DCAPP系列:开目浏览器KMVue
  • Yi - Ai 基于NineAi2.4.2的二开版本,含编译包和整合包,无需授权,全套源码,开箱即用,支持国内外热门大模型
  • 【word】保存重开题注/交叉引用消失,全局更新域问题
  • Kafka 消息 0 丢失的最佳实践
  • HTML操作详解
  • Python可迭代对象迭代器对象
  • 2025最新版Node.js安装使用指南
  • Node.js项目启动流程以及各个模块执行顺序详解
  • springboot做接口限流
  • 基于SSM实现的bbs论坛系统功能实现四
  • JSX 的基础概述、优势与工作原理(babel解析为JS)
  • 关于 CUPTI samples 中 的 pc_sample case
  • git 的 Detached HEAD
  • Opencv 图像基本操作
  • 大白话React Hooks,新特性怎么用?
  • Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)
  • 从 0 到 1,用 Python 构建超实用 Web 实时聊天应用
  • C# Enumerable类 之 数据筛选
  • gradle学习-mac安装
  • 电子游艺网站开发/如何建一个自己的网站
  • 做旅游平台网站找哪家好/产品销售方案与营销策略
  • 如何下载别人的网站模板/百度知道网页版登录入口
  • 东莞品牌网站建设报价/免费推广网站大全下载安装
  • 周口建设公司网站/广州网络营销产品代理
  • 厦门市网站建设app开发/百度网站联系方式