C++设计模式浅识组合模式

黄舟
Lepaskan: 2017-01-17 13:28:51
asal
1255 orang telah melayarinya

组合模式(Composite):将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

何时使用组合模式: 

当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。

下面代码使用组合模式定义了包含人力资源部和财务部这些基本对象和分公司、办事处等组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去,客户端代码中,任何用到基本对象的地方都可以使用组合对象。简单的说组合模式可以让客户一致地使用组合结构和单个对象。

模式实现:

[code]#ifndef COMPOSITE_H
#define COMPOSITE_H
#include<iostream>
#include<string>
#include<list>
using namespace std;
class Company
{
    //friend class ConcreteCompany;
protected:
    string name;
public:
    Company(){}
    Company(string St) :name(St){}
    virtual void Add(Company * c){};
    virtual void Remove(Company * c){};
    virtual void Display(int depth){ cout << name; };
    virtual void LineOfDuty(){};
};

class ConcreteCompany :public Company
{
    list < Company*> companys;
public:
    ConcreteCompany(string st);
    void Add(Company * c);
    void Remove(Company * c);
    void Display(int depth);
    void LineOfDuty();
};

ConcreteCompany::ConcreteCompany(string st){ name = st; companys.push_back(new Company(st)); }
void ConcreteCompany::Add(Company * c)
{
    companys.push_back(c);
}
void ConcreteCompany::Remove(Company * c)
{
    companys.remove(c);
}
void ConcreteCompany::Display(int depth)
{
    int n = depth;
    while (n)
    {
        cout << "-"; --n;
    }
    for each (Company* var in companys)
    {
        var->Display(depth + 2);
        cout << endl;
    }
}
void ConcreteCompany::LineOfDuty()
{
    for each (Company * var in companys)
    {
        var->LineOfDuty();
        cout << endl;
    }
}

class HRDepartment : public Company
{
public:
    HRDepartment(string st);
    void Add(Company * c);
    void Remove(Company * c);
    void Display(int depth);
    void LineOfDuty();
};

void HRDepartment::Add(Company * c)
{

}

HRDepartment::HRDepartment(string st)
{
    name = st;
}

void HRDepartment::Remove(Company * c)
{

}

void HRDepartment::Display(int depth)
{
    int n = depth;
    while (n)
    {
        cout << "-"; --n;
    }
    cout << name;
}
void HRDepartment::LineOfDuty()
{
    cout << name << " 员工招聘培训管理。\n";
}

class FinanceDepartment :public Company
{
public:
    FinanceDepartment(string st) { name = st; }
    void Add(Company * c){};
    void Remove(Company * c){};
    void Display(int depth);
    void LineOfDuty();
};

void FinanceDepartment::Display(int depth)
{
    int n = depth;
    while (n)
    {
        cout << "-"; --n;
    }
    cout << name;
}

void FinanceDepartment::LineOfDuty()
{
    cout << name << " 公司财务收支管理。\n";
}

#endif
Salin selepas log masuk

客户端:

[code]#include"Composite.h"
int main()
{
    Company* root=new ConcreteCompany ("北京总公司");
    root->Add(new HRDepartment("总公司人力资源部"));
    root->Add(new FinanceDepartment("总公司财务部"));

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

    ConcreteCompany comp1("南京办事处");
    comp1.Add(new HRDepartment("南京办事处人力资源部"));
    comp1.Add(new FinanceDepartment("南京办事处财务部"));
    comp.Add(&comp1);

    ConcreteCompany comp2("杭州办事处");
    comp2.Add(new HRDepartment("杭州办事处人力资源部"));
    comp2.Add(new FinanceDepartment("杭州办事处财务部"));
    comp.Add(&comp2);
    root->Display(1);
    root->LineOfDuty();

    comp.Remove(&comp1);
    root->Display(1);
    root->LineOfDuty();
    return 0;
}
Salin selepas log masuk

以上就是C++设计模式浅识组合模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!


sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan