複合モード (複合): オブジェクトをツリー構造に結合して、「部分全体」の階層を表します。合成パターンにより、ユーザーは単一オブジェクトと複合オブジェクトを一貫して使用できるようになります。
組み合わせパターンを使用する場合:
要件が部分と全体の階層構造を反映することであることが判明した場合、およびユーザーが結合オブジェクトと単一オブジェクトの違いを無視して、すべてのオブジェクトを構造を均一に結合するには、結合モードの使用を検討する必要があります。
次のコードは、組み合わせパターンを使用して、人事部や財務部などの基本オブジェクトと、支店やオフィスなどの結合オブジェクトを含むクラス階層を定義します。基本オブジェクトは、より複雑な結合オブジェクトに結合でき、この結合オブジェクトは再度結合することができます。など、クライアント コードでは、基本オブジェクトが使用される場所であればどこでも結合オブジェクトを使用できます。簡単に言うと、合成パターンにより、クライアントは複合構造と個々のオブジェクトを一貫して使用できるようになります。
パターン実装:
[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 中国語 Web サイト (www.php.cn) を参照してください。 !