C++ 设计模式之组合模式

这篇具有很好参考价值的文章主要介绍了C++ 设计模式之组合模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【声明】本题目来源于卡码网(题目页面 (kamacoder.com))

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】


【简介】什么是组合模式

        组合模式是⼀种结构型设计模式,它将对象组合成树状结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统⼀处理单个对象和对象的组合,⽽⽆需区分它们的具体类型。


【基本结构】

组合模式包括下⾯⼏个⻆⾊:

        理解起来⽐较抽象,我们⽤“省份-城市”举个例⼦,省份中包含了多个城市,如果将之⽐喻成⼀个树形结构,城市就是叶⼦节点,它是省份的组成部分,⽽“省份”就是合成节点,可以包含其他城市,形成⼀个整体,省份和城市都是组件,它们都有⼀个共同的操作,⽐如获取信息。

  • Component 组件: 组合模式的“根节点”,定义组合中所有对象的通⽤接⼝,可以是抽象类或接⼝。该类中定义了⼦类的共性内容
  • Leaf 叶⼦:实现了Component接⼝的叶⼦节点,表示组合中的叶⼦对象,叶⼦节点没有⼦节点。
  • Composite 合成: 作⽤是存储⼦部件,并且在Composite中实现了对⼦部件的相关操作,⽐如添加、删除、获取⼦组件等。

        通过组合模式,整个省份的获取信息操作可以⼀次性地执⾏,⽽⽆需关⼼省份中的具体城市。这样就实现了对国家省份和城市的管理和操作。

C++ 设计模式之组合模式,c++,设计模式,开发语言,组合模式


 【简易实现】

        利用Java代码作以说明:

1. 组件接口

// 组件接⼝
interface Component {
    void operation();
}

2. 叶子节点

// 叶⼦节点
class Leaf implements Component {
    @Override
    public void operation() {
        System.out.println("Leaf operation");
    }
}

3. 组合节点

// 组合节点:包含叶⼦节点的操作⾏为
class Composite implements Component {
    private List<Component> components = new ArrayList<>();

    public void add(Component component) {
        components.add(component);
    }

    public void remove(Component component) {
        components.remove(component);
    }

    @Override
    public void operation() {
        System.out.println("Composite operation");
        for (Component component : components) {
            component.operation();
        }
    }
}

4. 客户端代码

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建叶⼦节点
        Leaf leaf = new Leaf();
        // 创建组合节点,并添加叶⼦节点
        Composite composite = new Composite();
        composite.add(leaf);
        composite.operation(); // 统⼀调⽤
    }
}

【使用场景】

        组合模式可以使得客户端可以统⼀处理单个对象和组合对象,⽆需区分它们之间的差异,⽐如在图形编辑器中,图形对象可以是简单的线、圆形,也可以是复杂的组合图形,这个时候可以对组合节点添加统⼀的操作。
        总的来说,组合模式适⽤于任何需要构建具有部分-整体层次结构的场景,⽐如组织架构管理、⽂件系统的⽂件和⽂件夹组织等。


【C++ 编码部分】

1. 题目描述

        小明所在的公司内部有多个部门,每个部门下可能有不同的子部门或者员工。请你设计一个组合模式来管理这些部门和员工,实现对公司组织结构的统一操作。部门和员工都具有一个通用的接口,可以获取他们的名称以及展示公司组织结构。

2. 输入描述

        第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。 接下来的 N 行,每行描述一个部门或员工的信息。部门的信息格式为 D 部门名称,员工的信息格式为 E 员工名称,其中 D 或 E 表示部门或员工。

3. 输出描述

        输出公司的组织结构,展示每个部门下的子部门和员工。

4. C++ 编码实例

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file CompositeMode.hpp
* @brief 组合模式
* @autor 写代码的小恐龙er
* @date 2024/01/12
*/

#include <iostream>
#include <string>
#include <vector>

using namespace std;
// 前置声明
// Component 组件: 组合模式的“根节点”,定义组合中所有对象的通⽤接⼝,可以是抽象类或接⼝
class Component;

// 叶⼦节点1 -- 部门 (还可以包含子部门和员工)
class Department;
// 叶子节点2 -- 员工
class Employee;

// 组合节点 -- 包含叶子节点的操作行为
class Composite;

// Component 组件: 组合模式的“根节点”
class Component
{
public:
    // 提供信息展示的公共接口
    virtual void ShowInfo(int depth) = 0;
};

// 叶⼦节点1 -- 部门 (还可以包含子部门和员工)
class Department : public Component
{
// 成员属性
private:
    // 部门名称
    string _name; 
    // 子部门 -- 新建子部门的室友  使用派生类来新建 基类
    std::vector<Component *> _childrenVec; 
    
//成员函数
public:
    // 重载构造函数 以便通过部门名称新建部门
    Department(){}
    Department(string name){
        this->_name = name;
    }
    // 添加子部门
    void AddSubDepartment(Component * component){
        _childrenVec.push_back(component);
    }
    // 重载部门信息展示函数
    void ShowInfo(int depth) override {
        // ======= 展示自己的信息 =======
        string info = "";
        for(int i = 0; i < depth; i++){
            info += "  ";
        }
        std::cout << info << _name << endl;
        
        // ======= 展示子部门的信息 =======
        for(int j = 0; j < _childrenVec.size(); j++){
            _childrenVec[j]->ShowInfo(depth + 1);
        }
    }
    
};

// 叶子节点2 -- 员工
class Employee : public Component
{
// 成员属性
private:
    // 员工名称
    string _name; 
    
//成员函数
public:
    // 重载构造函数 以便通过员工名称新建员工
    Employee(string name){
        this->_name = name;
    }
    
    // 重载员工信息展示函数
    void ShowInfo(int depth) override {
        // ======= 展示自己的信息 =======
        string info = "";
        for(int i = 0; i < depth; i++){
            info += "  ";
        }
        
        std::cout << info << "  " << _name << endl;
    }
};

// 组合节点 -- 包含叶子节点的操作行为
class Composite
{
// 成员属性
private:
    // 公司名称 -- 管理这些叶子节点的 根节点
    string _name;
    // 根节点
    Department *_rootDepartment;
    
// 成员函数
public:
    // 重载构造函数 来新建某个公司
    Composite(string name){
        this->_name = name;
        _rootDepartment = new Department(name);
    }
    // 析构函数
    ~Composite(){
        if(_rootDepartment != nullptr){
            delete _rootDepartment;
            _rootDepartment = nullptr;
        }
    }
    
    // 添加根节点下面的子节点
    void AddComponent(Component *component){
        _rootDepartment->AddSubDepartment(component);
    }
    
    // 信息展示初始函数 
    void ShowInfo(){
        std::cout << "Company Structure:" << endl;
        // 此时开头的根节点 不需要做缩进 故而 参数传入0
        _rootDepartment->ShowInfo(0);
    }
};

int  main()
{
    // 公司名称
    string companyName = "";
    //输入
    std::cin >> companyName;
    // 部门和员工总数
    int number = 0;
    // 输入
    std::cin >> number;
    // 组合节点 -- 传入公司名称 新建根节点
    Composite *company = new Composite(companyName);
    
    for(int i = 0; i < number; i++)
    {
        // 信息类型
        char type = ' ';
        // 名称 
        string name = "";
        // 输入
        std::cin >> type >> name;
        // 新建部门 -- 名称构造
        Component *component = nullptr;
        Employee *employee = nullptr;
        if(type == 'D'){
            // 新建部门派生类
            Component *component = new Department(name);
            company->AddComponent(component);
        }
        else if(type == 'E'){
            // 新建员工派生类
            Component *employee = new Employee(name);
            company->AddComponent(employee);
        }
        else continue;
        
        // 析构掉New出来的内存
        if(component != nullptr) {
            delete component;
            component = nullptr;
        }
        if(component != nullptr) {
            delete employee;
            employee = nullptr;
        }
    }
    
    // 添加完根节点和子节点后开始结构信息展示
    company->ShowInfo();
        
    // 析构掉New出来的内存
    delete company;
    company = nullptr;
    
    return 0;
}



......

To be continued.文章来源地址https://www.toymoban.com/news/detail-799467.html

到了这里,关于C++ 设计模式之组合模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式:组合模式

    组合模式是一种结构型设计模式,用于将对象组织成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,而不需要区分它们之间的差异。 在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点表示树结构中的

    2024年02月07日
    浏览(59)
  • 设计模式--组合模式

    某日,小明公司最近接到一个办公管理系统的项目,并且在每个城市都有分部。这属于是很常见的OA系统,只要前期将需求分析完善好,中后期开发维护是不难的。 然而,总部公司使用后觉得很OK,想要其他城市的分公司也执行使用。但是现在的问题是,其他分公司的部门和

    2024年01月21日
    浏览(58)
  • 结构型设计模式之组合模式【设计模式系列】

    C++技能系列 Linux通信架构系列 C++高性能优化编程系列 深入理解软件架构设计系列 高级C++并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月15日
    浏览(46)
  • 设计模式浅析(十) ·设计模式之迭代器&组合模式

    日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 案例 有两家门店,门店A呢只提供早餐,门店B呢只提供午餐,有一天这两家店铺想要进行合并,一起做大做强,再创辉煌。 合并后呢,对于菜单的定制存在了一定的问题: 门店A的

    2024年04月11日
    浏览(47)
  • 设计模式之组合模式笔记

    记录下学习设计模式-组合模式的写法。JDK使用版本为1.8版本。 意图 :将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 结构 : 其中: Component为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认

    2024年02月11日
    浏览(38)
  • 设计模式详解(十一)——组合模式

    组合模式定义 组合模式(Composite Pattern)是一种结构型设计模式,又叫部分整体模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

    2024年02月22日
    浏览(38)
  • 设计模式-组合模式(Composite)

    组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而不需要区分它们。 在本篇博客中,我们将详细介绍组合模式的概念,并提供一个简单的Java代码示

    2024年02月09日
    浏览(47)
  • Java设计模式-组合模式

    在软件设计中,设计模式是一种被广泛接受和应用的经验总结,旨在解决常见问题并提供可复用的解决方案。 组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式能够使客户端以一致的方式处理单个对象和对象集合,将

    2024年02月06日
    浏览(40)
  • 【23种设计模式】组合模式【⭐】

    个人主页 :金鳞踏雨 个人简介 :大家好,我是 金鳞 ,一个初出茅庐的Java小白 目前状况 :22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客 :这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进

    2024年02月09日
    浏览(43)
  • 设计模式详解-组合模式(整体部分模式)

    类型:结构型模式 特点:依据树形结构来组合对象,用来表示部分以及整体层次 作用:模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦,使用户对单个对象和组合对象的使用具有一致性。

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包