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

5.组合模式

目录

  • 一、概念
  • 二、类图详解
  • 三、组合模式实现步骤
  • 四、代码实现
    • 4.1 Component类
    • 4.2 Composite类
    • 4.3 Leaf类
    • 4.4 测试
  • 五、扩展

一、概念

  • 组合模式又叫整体--部分模式
  • 组合模式描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它们进行区分
  • 可以一致地对待容器对象和叶子对象。
  • 它使树型结构的问题中,模糊了简单元素复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

二、类图详解

在这里插入图片描述

  • 包含一个抽象组件类Component、叶子结点类Leaf和组件集合类Composite
  • 抽象组件类:组合中的对象声明接口,实现所有类共有接口的行为。声明用于访问和管理Component的子部件的接口。
  • 叶子结点:叶节点对象,就是终端独立结点,不能addRemove其它组件。
  • 组件集合类:实现Component的相关操作,可以继续包含组件集合类和叶子结点。
  • CompositeComponent类形成迭代关联关系。

三、组合模式实现步骤

  • 定义抽象组件接口
  • 实现叶子节点类,实现抽象组件类的接口。
  • 实现组件集合类,实现抽象组件类的接口。
  • 定义环境类,将叶子节点和组件集合加入根组件集合。

四、代码实现

  • 生成目录树结构,目录里面可以再放目录或文件
  • 最终的输出如下
    在这里插入图片描述

4.1 Component类

  • 顶层接口
#pragma once
#include <iostream>class Component
{
public:std::string name;  //叶子结点和组件结点都有名字和类型bool m_isLeaf;     //是否是叶子结点(暂时没用)Component(const std::string& name, bool isLeaf){this->name = name;this->m_isLeaf = isLeaf;}virtual void Add(Component* c) = 0;virtual void Remove(Component* c) = 0;virtual void Display(int depth) = 0;bool isLeaf() const{return this->m_isLeaf;}
};

4.2 Composite类

  • 用来放文件夹或文件
#pragma once
#include <iostream>
#include <list>#include "Component.h"class Composite: public Component
{
private:std::list<Component*> m_component;public:Composite(const std::string& name) : Component(name, false){}void Add(Component* c) override{m_component.push_back(c);}void Remove(Component* c) override{m_component.remove(c);}void Display(int depth) override{std::cout << std::string(depth, '-') << name << std::endl;for (auto item : m_component){item->Display(depth + 2);}}
};

4.3 Leaf类

  • 用来放文件
#pragma once
#include <iostream>
#include "Component.h"class Leaf: public Component
{
public:Leaf(const std::string& name): Component(name, true){}void Add(Component* c) override{std::cout << "Can't add component to leaf." << std::endl;}void Remove(Component* c) override{std::cout << "Can't remove component to leaf." << std::endl;}void Display(int depth) override{std::cout << std::string(depth, '-') << name << std::endl;}
};

4.4 测试

#include "Leaf.h"
#include "Composite.h"class Client
{
private:Component* com;public:Client(Component* obj){com = obj;}void display(int n){com->Display(n);}
};int main()
{Component* root = new Composite("根目录");root->Add(new Leaf("根目录下的文件A"));root->Add(new Leaf("根目录下的文件B"));Component* dir1 = new Composite("根目录下的文件夹FA");dir1->Add(new Leaf("文件夹FA下的文件A"));dir1->Add(new Leaf("文件夹FA下的文件B"));root->Add(dir1);Component* dir2 = new Composite("根目录FA下的文件夹FAX");dir2->Add(new Leaf("文件夹FAX下的文件A"));dir2->Add(new Leaf("文件夹FAX下的文件B"));dir1->Add(dir2);root->Add(new Leaf("根目录下的文件C"));root->Add(new Leaf("根目录下的文件D"));Client c(root);c.display(1);return 0;
}

五、扩展

  • 设计一个饭店的菜单
  • 可以再包含一个菜单或者菜单项
  • 类图如下
    在这里插入图片描述
  • 菜单项图结构如下
    在这里插入图片描述
  • 代码部分请参阅 https://gitee.com/piglittle/design_patterns中的 Head_First_Design_Partterns解决方案下的 composite_pattern项目
http://www.dtcms.com/a/287785.html

相关文章:

  • lowbit小解
  • C#操作WPS表格
  • LVS工作模式和算法的总结
  • 【RK3576】【Android14】摄像头MIPI开发调试
  • 基于单片机智能插座设计/智能开关
  • 了解pycharm的基本运用
  • Qt笔记整理(1)
  • 使用PyInstaller打包 Python 工程
  • 【C++基础】内存对齐原则与性能影响:面试高频考点与真题解析
  • CSS篇——第二章 六十五项关键技能(下篇)
  • 统计学习方法的三要素
  • Github Actions Workflows 上传 Dropbox
  • 物联网-规则引擎的定义
  • 解决问题七大步骤
  • python基础复习
  • 【RL第一篇】强化学习入门:核心概念全面详解
  • 永磁同步电机控制算法--弱磁控制(变交轴CCR-VQV)
  • vue2 面试题及详细答案150道(141 - 150)
  • VUE2 学习笔记1
  • ndexedDB 与 LocalStorage:全面对比分析
  • 4 ASPICE的支持过程
  • docker构建springboot镜像
  • 【初识数据结构】CS61B中的基本图算法:DFS, BFS, Dijkstra, A* 算法及其来历用法
  • 字节跳动开源Seed-X 7B多语言翻译模型:28语种全覆盖,性能超越GPT-4、Gemini-2.5与Claude-3.5
  • 【开源项目】GPT学术优化 - GPT Academic
  • 探秘边缘安全架构设计要点解析
  • Linux 自旋锁
  • 四阶电商SEO审计指南:诊断流量漏洞→重建增长引擎(附免费工作簿)
  • 音频3A处理简介之AEC(回音消除)
  • 文生图-StoryGAN:用于故事可视化的顺序条件GAN