组合模式(大话设计模式)C/C++版本

组合模式

在这里插入图片描述

C++

#include <iostream>
#include <list>
using namespace std;
// 公司类... 抽象或者接口
class Company
{
public:
    Company(string name)
    {
        this->name = name;
    }
    virtual void Add(Company *c) = 0;    // 增加
    virtual void Remove(Company *c) = 0; // 移除
    virtual void Display(int depth) = 0; // 显示
    virtual void LineOfDuty() = 0;       // 履行职责...不同部分履行的职责不一样
protected:
    string name;
};

// 具体公司类  树枝节点
class ConcreteCompany : public Company
{
public:
    ConcreteCompany(string name) : Company(name) {}

    virtual void Add(Company *c)
    {
        children->push_back(c);
    }
    virtual void Remove(Company *c)
    {
        children->remove(c);
    }
    virtual void Display(int depth)
    {
        string s(depth, '-');
        cout << s << name << endl;
        for (list<Company *>::iterator it = children->begin(); it != children->end(); it++)
        {
            (*it)->Display(depth + 2);
        }
    }
    virtual void LineOfDuty()
    {
        for (list<Company *>::iterator it = children->begin(); it != children->end(); it++)
        {
            (*it)->LineOfDuty();
        }
    }

private:
    list<Company *> *children = new list<Company *>;
};

// 叶子节点  人力资源部
class HRDepartment : public Company
{
public:
    HRDepartment(string name) : Company(name) {}

    virtual void Add(Company *c) {}
    virtual void Remove(Company *c) {}
    virtual void Display(int depth)
    {
        string s(depth, '-');
        cout << s << name << endl;
    }
    virtual void LineOfDuty()
    {
        cout << name << " 员工招聘培训管理" << endl;
    }
};

class FinanceDepartment : public Company
{
public:
    FinanceDepartment(string name) : Company(name) {}

    virtual void Add(Company *c) {}
    virtual void Remove(Company *c) {}
    virtual void Display(int depth)
    {
        string s(depth, '-');
        cout << s << name << endl;
    }
    virtual void LineOfDuty()
    {
        cout << name << " 公司财务收支管理" << endl;
    }
};

int main()
{
    ConcreteCompany *root = new ConcreteCompany("北京总公司");
    root->Add(new HRDepartment("总公司人力资源部"));
    root->Add(new FinanceDepartment("总公司财务部"));

    ConcreteCompany *comp = new ConcreteCompany("上海华东分公司");
    comp->Add(new HRDepartment("华东分公司人力资源部"));
    comp->Add(new FinanceDepartment("华东分公司财务部"));
    root->Add(comp);

    ConcreteCompany *comp1 = new ConcreteCompany("南京办事处");
    comp1->Add(new HRDepartment("南京办事处人力资源部"));
    comp1->Add(new FinanceDepartment("南京办事处财务部"));
    comp->Add(comp1);

    ConcreteCompany *comp2 = new ConcreteCompany("杭州办事处");
    comp2->Add(new HRDepartment("杭州办事处人力资源部"));
    comp2->Add(new FinanceDepartment("杭州办事处财务部"));
    comp->Add(comp2);

    cout << "结构图: " << endl;
    root->Display(1);

    cout << "\n职责图: " << endl;
    root->LineOfDuty();

    delete comp2;
    delete comp1;
    delete comp;
    delete root;

    return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Company
{
    char *name;
    struct Company **children;
    size_t child_count;
    void (*add)(struct Company *, struct Company *);
    void (*remove)(struct Company *);
    void (*display)(struct Company *, int);
    void (*lineOfDuty)(struct Company *);
} Company;

typedef struct
{
    Company company;
    void (*lineOfDuty)(Company *);
} LeafCompany;

void company_add(Company *company, Company *child);
void company_display(Company *company, int depth);
void company_lineOfDuty(Company *company);

void company_init(Company *company, const char *name)
{
    company->name = strdup(name);
    company->children = NULL;
    company->child_count = 0;
    company->add = &company_add;
    company->remove = NULL; // 实现时需要具体逻辑
    company->display = &company_display;
    company->lineOfDuty = &company_lineOfDuty;
}

void company_free(Company *company)
{
    free(company->name);
    size_t i;
    for (i = 0; i < company->child_count; ++i)
    {
        company_free(company->children[i]);
    }
    free(company->children);
    free(company);
}

void company_add(Company *company, Company *child)
{
    company->children = realloc(company->children, sizeof(Company *) * (company->child_count + 1));
    company->children[company->child_count++] = child;
}

void company_display(Company *company, int depth)
{
    char s[depth + 1];
    memset(s, '-', depth);
    s[depth] = '\0';
    printf("%s%s\n", s, company->name);
    size_t i;
    for (i = 0; i < company->child_count; ++i)
    {
        company->children[i]->display(company->children[i], depth + 2);
    }
}

void company_lineOfDuty(Company *company)
{
    size_t i;
    for (i = 0; i < company->child_count; ++i)
    {
        company->children[i]->lineOfDuty(company->children[i]);
    }
}

void leaf_company_init(LeafCompany *leaf, const char *name, void (*duty)(Company *))
{
    leaf->company.name = strdup(name);
    leaf->company.add = NULL;
    leaf->company.remove = NULL;
    leaf->company.display = &company_display;
    leaf->company.lineOfDuty = duty;
    leaf->lineOfDuty = duty;
}

void hr_department_lineOfDuty(Company *company)
{
    printf("%s 员工招聘培训管理\n", company->name);
}

void finance_department_lineOfDuty(Company *company)
{
    printf("%s 公司财务收支管理\n", company->name);
}

int main()
{
    Company *root = malloc(sizeof(Company));
    company_init(root, "北京总公司");

    LeafCompany *hr_root = malloc(sizeof(LeafCompany));
    leaf_company_init(hr_root, "总公司人力资源部", hr_department_lineOfDuty);
    root->add(root, (Company *)hr_root);

    LeafCompany *finance_root = malloc(sizeof(LeafCompany));
    leaf_company_init(finance_root, "总公司财务部", finance_department_lineOfDuty);
    root->add(root, (Company *)finance_root);

    Company *shanghai_comp = malloc(sizeof(Company));
    company_init(shanghai_comp, "上海华东分公司");
    root->add(root, shanghai_comp);

    LeafCompany *hr_shanghai = malloc(sizeof(LeafCompany));
    leaf_company_init(hr_shanghai, "华东分公司人力资源部", hr_department_lineOfDuty);
    shanghai_comp->add(shanghai_comp, (Company *)hr_shanghai);

    LeafCompany *finance_shanghai = malloc(sizeof(LeafCompany));
    leaf_company_init(finance_shanghai, "华东分公司财务部", finance_department_lineOfDuty);
    shanghai_comp->add(shanghai_comp, (Company *)finance_shanghai);

    Company *nanjing_office = malloc(sizeof(Company));
    company_init(nanjing_office, "南京办事处");
    shanghai_comp->add(shanghai_comp, nanjing_office);

    LeafCompany *hr_nanjing = malloc(sizeof(LeafCompany));
    leaf_company_init(hr_nanjing, "南京办事处人力资源部", hr_department_lineOfDuty);
    nanjing_office->add(nanjing_office, (Company *)hr_nanjing);

    LeafCompany *finance_nanjing = malloc(sizeof(LeafCompany));
    leaf_company_init(finance_nanjing, "南京办事处财务部", finance_department_lineOfDuty);
    nanjing_office->add(nanjing_office, (Company *)finance_nanjing);

    printf("结构图:\n");
    root->display(root, 1);

    printf("\n职责图:\n");
    root->lineOfDuty(root);

    company_free(root); // 释放根节点,递归释放所有子节点

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/796388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker inspect 如何提取容器的ip和端口 网络信息?

目录 通过原生Linux命令过滤找到IP 通过jq工具找到IP 使用docker -f 的过滤&#xff08;模板&#xff09; 查找端口映射信息 查看容器内部细节 docker inspect 容器ID或容器名 通过原生Linux命令过滤找到IP 通过jq工具找到IP jq 是一个轻量级且灵活的命令行工具&#xf…

几何距离与函数距离:解锁数据空间中的奥秘

几何距离&#xff1a;直观的空间度量 几何距离&#xff0c;顾名思义&#xff0c;是我们在几何学中熟悉的距离概念&#xff0c;如欧几里得距离、曼哈顿距离和切比雪夫距离等。这些距离度量直接反映了数据点在多维空间中的位置关系。 欧几里得距离&#xff1a;最为人熟知的几何距…

基于springboot+vue+uniapp的机电公司管理信息系统

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

Coze:如何使用团队空间?

你好&#xff0c;我是三桥君 团队空间&#xff0c;是一个允许我们组建团队并共享机器人、插件等资源的功能。 好的&#xff0c;让我们开始创建一个团队。我们将这个团队命名为“三桥君AI”&#xff0c;并在描述中也填写“这里是关于“三桥君AI”团队的描述”。点击确定后&…

【代码随想录】【算法训练营】【第67天】 [卡码97]小明逛公园 [卡码127]骑士的攻击

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 67&#xff0c;周六&#xff0c;ding~ [卡码97] 小明逛公园 题目描述 卡码97 小明逛公园 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 Floyd 算法 [卡码…

css实现渐进中嵌套渐进的方法

这是我们想要的实现效果&#xff1a; 思路&#xff1a; 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意&#xff1a;这里的采用的定位方法&#xff0c;所以在内部的元素一律要使用绝对定位&#xff0c;否则会出现层级的问题&…

61、基于卷积神经网络的手写数字旋转角度预测(matlab)

1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下&#xff0c;我们可以通过构建一个卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;来实现该任务。以下…

SPI协议与读写串行 FLASH

SPI 协议简介 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是美国摩托罗拉公司&#xff08;Motorola&#xff09;最先推出的一种同步串行传输规范&#xff0c;也是一种单片机外设芯片串行扩展接口&#xff0c;是一种高速、全双工、…

Vue2打包部署后动态修改后端接口地址的解决方法

文章目录 前言一、背景二、解决方法1.在public文件夹下创建config文件夹&#xff0c;并创建config.js文件2.编写config.js内容3.在index.html中加载config.js4.在封装axios工具类的js中修改配置 总结 前言 本篇文章将介绍使用Vue2开发前后端分离项目时&#xff0c;前端打包部署…

LeetCode分发糖果(贪心思路分析)

题目描述 贪心思路 思路及解法 我们可以将「相邻的孩子中&#xff0c;评分高的孩子必须获得更多的糖果」这句话拆分为两个规则&#xff0c;分别处理。 左规则&#xff1a;当 ratings[i−1]<ratings[i] 时&#xff0c;i 号学生的糖果数量将比 i−1 号孩子的糖果数量多。 …

elasticsearch集群模式部署

系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) es版本&#xff1a; elasticsearch-7.6.2 本次搭建es集群为三个节点 添加启动用户 确保elasticsearch的启动用户为普通用户&#xff0c;这里我创建了es用户用于启动elasticsearch 执行命令为es用户添加sudo权限 v…

基于AT89C51单片机超声波水位液位控制系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 设计任务与要求 原理图 仿真图 代码 系统论文 资源下载 设计任务与要求…

【微信小程序知识点】手机号验证组件

手机验证组件&#xff0c;用于帮助开发者向用户发起手机号申请&#xff0c;必须经过用户同意后&#xff0c;才能获得由平台验证后的手机号&#xff0c;进而为用户提供相应的服务。 手机号验证组件分为两种&#xff1a;手机号快速验证组件以及手机号实时验证组件。 1.手机号快速…

内网对抗-基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建

知识点&#xff1a; 1、基石框架篇-单域架构-权限控制-用户和网络 2、基石框架篇-单域架构-环境搭建-准备和加入 3、基石框架篇-单域架构-信息收集-手工和工具1、工作组(局域网) 将不同的计算机按照功能分别列入不同的工作组。想要访问某个部门的资源&#xff0c;只要在“网络…

MES实时监控食品加工过程中各环节的安全

在实时监控食品加工过程中各环节的安全风险方面&#xff0c;万界星空科技的MES&#xff08;制造执行系统&#xff09;解决方案发挥了至关重要的作用。以下是具体如何通过MES系统实现实时监控食品加工过程中各环节安全风险的详细阐述&#xff1a; 一、集成传感器与实时监控 MES…

Prometheus + alermanager + webhook-dingtalk 告警

添加钉钉机器人 1. 部署 alermanager 1.1 下载软件包 wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 网址 &#xff1a;Releases prometheus/alertmanager (github.com) 1.2 解压软件包 mkdir -pv …

博物馆地图导航系统:高精度地图引擎与AR/VR融合,实现博物馆数字化转型

在人民日益追求精神文化的时代下&#xff0c;博物馆作为传承与展示人类文明的璀璨殿堂&#xff0c;其重要性不言而喻。然而&#xff0c;随着博物馆规模的不断扩大和藏品种类的日益丰富&#xff0c;游客在享受知识盛宴的同时&#xff0c;也面临着“迷路”与“错过”的困扰。博物…

Python-PLAXIS自动化建模技术与典型岩土工程

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多软件都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 搭建自己的Plaxis模型&#xff…

flutter 列表下拉框加搜索

1.使用控件搜索加下拉框dropdown_search: ^0.4.9和获取中文拼音lpinyin: ^1.1.1 2.加入中文查询和首字查询 在当中找到相应的packages&#xff0c;再在SelectDialog.dart当中加入引入拼音搜索 import package:lpinyin/lpinyin.dart; 更改匹配方法manageItemsByFilter使其可…

云动态摘要 2024-07-12

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…