집 >백엔드 개발 >C#.Net 튜토리얼 >C++ 디자인 패턴의 조합 패턴에 대한 간략한 소개
복합 모드(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)로!