>백엔드 개발 >C#.Net 튜토리얼 >C++ 디자인 패턴의 조합 패턴에 대한 간략한 소개

C++ 디자인 패턴의 조합 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-17 13:28:511262검색

복합 모드(Composite): 개체를 트리 구조로 결합하여 '부분-전체' 계층을 나타냅니다. 구성 패턴을 통해 사용자는 단일 개체와 복합 개체를 일관되게 사용할 수 있습니다.

조합 패턴을 사용해야 하는 경우:

요구 사항이 부분 및 전체 수준의 구조를 반영하고 사용자가 결합된 개체와 단일 개체의 차이를 무시할 수 있기를 바라는 경우 , 균일하게 사용 구조의 모든 객체를 결합할 때 Compose 패턴 사용을 고려해야 합니다.

다음 코드는 결합 패턴을 사용하여 인사부, 재무부 등의 기본 개체와 지점, 사무실 등의 결합 개체를 포함하는 클래스 계층 구조를 정의합니다. 기본 개체는 더 복잡한 결합 개체로 결합될 수 있으며, 이 결합된 개체는 다시 결합될 수 있으며, 클라이언트 코드에서는 기본 개체가 사용되는 모든 곳에서 결합된 개체를 사용할 수 있습니다. 간단히 말해서, 구성 패턴을 통해 클라이언트는 복합 구조와 개별 개체를 일관되게 사용할 수 있습니다.

패턴 구현:

[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

클라이언트:

[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;
}

위는 C++ 디자인 패턴 간략 소개의 조합 패턴 내용입니다. PHP 중국어 홈페이지(www.php.cn)로!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.