组合模式Demo

#include <QCoreApplication>
#include <iostream>
#include <list>
using namespace std;

class Company
{
public:
    Company(string name)
    {
        m_name = name;
    }
    virtual void Add(Company *company) = 0;
    virtual void Display(int d) = 0;
    virtual void Duty() = 0;
public:
    string m_name;
};

class ConCompany: public Company
{
private:
    list<Company*> comList;

public:
    ConCompany(string name):Company(name){}
    void Add(Company *company) override
    {
        comList.push_back(company);
    }

    void Display(int d) override
    {
        for(int i = 0; i < d; i++)
        {
            qDebug() << "-";
        }
        qDebug() << QString::fromUtf8(m_name.c_str()) << Qt::endl;

        for(auto e : comList)
        {
            e->Display(d + 1);
        }
    }
    void Duty() override
    {
        for(const auto &e : comList)
        {
            e->Duty();
        }
    }
};

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

    void Add(Company *company) override{}

    void Display(int d) override
    {
        for(int i = 0; i < d; i++)
        {
            qDebug() << "-";
        }
        qDebug() << QString::fromUtf8(m_name.c_str()) << Qt::endl;
    }

    void Duty() override
    {
        qDebug() << QString::fromUtf8(m_name.c_str()) << ": 各项产品的技术研发与生产" << Qt::endl;
    }
};

class OperaPart : public Company
{
public:
    OperaPart(string name) : Company(name){}
    void Add(Company *company) override {}

    void Display(int d) override
    {
        for (int i = 0; i < d; ++ i)
        {
            qDebug() << "-";
        }
        qDebug() << QString::fromUtf8(m_name.c_str()) << Qt::endl;
    }
    void Duty() override
    {
        qDebug() << QString::fromUtf8(m_name.c_str()) << ": 产品运营与销售" << Qt::endl;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Company *root = new ConCompany("总公司");
    root->Add(new TechPart("总公司技术部"));
    root->Add(new OperaPart("总公司运营部"));

    Company *company = new ConCompany("分公司");
    root->Add(company);
    company->Add(new TechPart("分公司技术部"));
    company->Add(new OperaPart("分公司运营部"));

    Company *company1 = new ConCompany("分公司Aux办事处");
    company->Add(company1);
    company1->Add(new TechPart("分公司Aux办事处技术部") );
    company1->Add(new OperaPart("分公司Aux办事处运营部") );

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

    qDebug() << "职责: " << Qt::endl;
    root->Duty();
    delete root;
    delete company;
    delete company1;
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值