设计模式之组合模式

//设计模式之组合模式
/*组合模式将对象组合成树形结构表示部分整体的层次结构,使得用户对单个对象和组合
对象的使用具有一致性
透明方式和安全方式,在component中声明用来管理子对象的方法,这样实现的所有
component接口的所有子类都具备父类具有的功能,具有完全一致的行为接口。
安全方式在接口中不声明remove和add的方法,子类也就不需要实现它,在component
中声明所有用来管理子类对象的方法,由于不透明行,树中不具备相同的接口,客户端调用
需要作出判断。
什么时候使用组合模式?
需求中体现部分与总体的结构层次,希望用户可以忽略组合对象与单个对象的不同,统一
使用组合结构中所有对象,考虑使用组合模式*/
#include<iostream>
#include<string>
#include<list>

using namespace std;

class Company
{
    string m_name;
public:
    Company(string name) :m_name(name) {};
    string getname() { return m_name; }
    virtual void Add(Company* c) = 0;
    virtual void Remove(Company* c) = 0;
    virtual void Display(int dapth) = 0;
    virtual void LineOfDuty() = 0;
};
class RealCompany :public Company
{
    list<Company*> link;
    list<Company*>::iterator it;
public:
    RealCompany(string name) :Company(name) {};

    void Add(Company* c)
    {
        link.push_back(c);
    }
    void Remove(Company* c)
    {
        link.remove(c);
    }
    void Display(int dapth)
    {
        cout << "-" << this->getname() << endl;
        for (it = link.begin(); it != link.end(); it++)
        {
            for (int i = 0; i < dapth; i++)
                cout << "-";
            (*it)->Display(dapth);
        }
    }
    void LineOfDuty()
    {
        for (it = link.begin(); it != link.end(); it++)
        {
            (*it)->LineOfDuty();
        }
    }

};
class HRDepartmemt :public Company
{
public:
    HRDepartmemt(string name) :Company(name) {};
    void Add(Company* c)
    {
        return;
    }
    void Remove(Company* c)
    {
        return;
    }
    void Display(int dapth)
    {
        cout << this->getname() << endl;
    }
    void LineOfDuty()
    {
        cout << this->getname() << "员工招聘培训管理" << endl;
    }
};

class FinDepartmemt :public Company
{
public:
    FinDepartmemt(string name) :Company(name) {};
    void Add(Company* c)
    {
        return;
    }
    void Remove(Company* c)
    {
        return;
    }
    void Display(int dapth)
    {
        cout << this->getname() << endl;
    }
    void LineOfDuty()
    {
        cout << this->getname() << "公司财务收支管理" << endl;
    }
};

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

    RealCompany* shanghai = new RealCompany("上海分公司");
    shanghai->Add(new HRDepartmemt("华东分公司人力资源部"));
    shanghai->Add(new FinDepartmemt("华东分公司财务部"));
    root->Add(shanghai);

    RealCompany * nanjing = new RealCompany("南京办事处");
    nanjing->Add(new HRDepartmemt("南京办事处人力资源部"));
    nanjing->Add(new FinDepartmemt("南京办事处财务处"));
    root->Add(nanjing);

    cout << "\n结构图" << endl;
    root->Display(1);
    cout << "\n职责" << endl;
    root->LineOfDuty();
    root->Remove(nanjing);
    cout << "\n结构图" << endl;
    root->Display(1);
    cout << "\n职责" << endl;
    root->LineOfDuty();

    system("pause");

    return 0;
}

运行结果为


结构图
-北京总公司
-总公司人力资源部
-总公司财务部
--上海分公司
-华东分公司人力资源部
-华东分公司财务部
--南京办事处
-南京办事处人力资源部
-南京办事处财务处

职责
总公司人力资源部员工招聘培训管理
总公司财务部公司财务收支管理
华东分公司人力资源部员工招聘培训管理
华东分公司财务部公司财务收支管理
南京办事处人力资源部员工招聘培训管理
南京办事处财务处公司财务收支管理

结构图
-北京总公司
-总公司人力资源部
-总公司财务部
--上海分公司
-华东分公司人力资源部
-华东分公司财务部

职责
总公司人力资源部员工招聘培训管理
总公司财务部公司财务收支管理
华东分公司人力资源部员工招聘培训管理
华东分公司财务部公司财务收支管理
请按任意键继续. . .

看的懂得同学们已经看出了该种设计模式的便利之处在于两个Add和remove两个空方法声明,return不返回任何东西,可以添加删除公司的类和它的子类管理节点。很好的一个机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值