《组合模式(极简c++)》

        本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


        本章简要说明组合模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。

模式说明

  • 方案:组合模式是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户端能够统一地处理单个对象和组合对象。
  • 优点:
    •  简化客户端代码:客户端无需区分单个对象和组合对象,可统一处理。
    •  灵活性和可扩展性:能够轻松添加新的组件,不影响现有代码。
  • 缺点:
    •  对于简单的层次结构,可能会引入过多的一般化类和接口。
    •  可能限制特定操作:某些操作可能在叶节点和组合节点上没有意义,需要客户端进行判断。

本质思想:类A中有一个数组,数组里面都是A*(可以实际指向A的派生类),这样可以建一个全是A的树

实践建议:在运行时,需要构建一个全是相同基类的树,并要统一处理时使用

代码示例

#include <iostream>
#include <vector>

class Bird {
public:
    Bird(int age):age_(age) {}

    void print() {
        std::cout << "Bird is " << age_ << " years old." << std::endl;
        for (auto& bird : birds) {
            bird->print();
        }
    }

    void add_son(Bird* bird) {
        birds.emplace_back(bird);
    }

private:
    int age_;
    std::vector<Bird*> birds;
};

class BirdSon : public Bird {
public:
    BirdSon(int age):Bird(age) {}
// ...Other interface
};

int main() {
    Bird* bird_father = new Bird(10);
    BirdSon* bird_big_son = new BirdSon(2);
    BirdSon* bird_litte_son = new BirdSon(1);
    bird_father->add_son(bird_big_son);
    bird_father->add_son(bird_litte_son);
    bird_father->print();
    delete bird_father;
    delete bird_big_son;
    delete bird_litte_son;
/*
输出:
    Bird is 10 years old.
    Bird is 2 years old.
    Bird is 1 years old.
*/
}

相关推荐

  1. 组合模式c++)》

    2024-03-26 06:30:11       43 阅读
  2. 模版模式c++)》

    2024-03-26 06:30:11       34 阅读
  3. 《工厂模式c++)》

    2024-03-26 06:30:11       43 阅读
  4. 《原型模式c++)》

    2024-03-26 06:30:11       57 阅读
  5. 《过滤器模式c++)》

    2024-03-26 06:30:11       46 阅读
  6. 《适配器模式c++)》

    2024-03-26 06:30:11       45 阅读
  7. 《外观模式c++)》

    2024-03-26 06:30:11       38 阅读
  8. 《备忘录模式c++)》

    2024-03-26 06:30:11       38 阅读
  9. 《命令模式c++)》

    2024-03-26 06:30:11       33 阅读
  10. 《状态模式c++)》

    2024-03-26 06:30:11       152 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 06:30:11       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 06:30:11       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 06:30:11       87 阅读
  4. Python语言-面向对象

    2024-03-26 06:30:11       96 阅读

热门阅读

  1. sql中添加数据的命令

    2024-03-26 06:30:11       38 阅读
  2. 深入探索Spring框架中的设计模式精髓

    2024-03-26 06:30:11       29 阅读
  3. mace | ubuntu编译mace

    2024-03-26 06:30:11       38 阅读
  4. Rust机器学习框架Candle

    2024-03-26 06:30:11       40 阅读
  5. 重构文件上传行为

    2024-03-26 06:30:11       39 阅读
  6. 2024华为软件精英挑战赛记录

    2024-03-26 06:30:11       78 阅读
  7. React 抽屉显示和隐藏

    2024-03-26 06:30:11       38 阅读
  8. React - 面试题

    2024-03-26 06:30:11       39 阅读
  9. 前端-包管理器

    2024-03-26 06:30:11       45 阅读
  10. 服务器离线配置vscode连接,conda虚拟环境

    2024-03-26 06:30:11       40 阅读
  11. LightDB24.1ECPG支持EXEC ORACLE OPTION语法

    2024-03-26 06:30:11       42 阅读
  12. 前端Ajax请求从后端获取二进制文件并下载

    2024-03-26 06:30:11       45 阅读
  13. 数字后端概念——FinFET/Nanosheet FET

    2024-03-26 06:30:11       47 阅读
  14. tengine | tengine-nnie编译

    2024-03-26 06:30:11       40 阅读