定义:
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
类图:
类型:结构型
实例:
公司的组织结构
C++ 实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| #include <iostream> #include <vector> #include <string> using namespace std;
class Company { public: Company(string name) { this->name=name; } virtual void add(Company*)=0; virtual void remove(Company*)=0; virtual void display(int)=0; virtual void lineOfDuty()=0; protected: string name; };
class HRDepartment:public Company { public: HRDepartment(string name):Company(name) {} void add(Company *c) { } void remove(Company *c) { } void display(int depth) { string str(depth,'-'); str+=name; cout<<str<<endl; } void lineOfDuty() { cout<<name << " 员工培训管理" <<endl; } };
class FinanceDepartment:public Company { public: FinanceDepartment(string name):Company(name) {} void add(Company *c) { } void remove(Company *c) { } void display(int depth) { string str(depth,'-'); str+=name; cout<<str<<endl; } void lineOfDuty() { cout<<name << " 公司财务收支管理" <<endl; } };
class ConcreteCompany:public Company { public: ConcreteCompany(string name):Company(name) {} void add(Company *c) { children.push_back(c); } void remove(Company *c) { vector<Company*>::iterator iter=children.begin(); while(iter!=children.end()) { if(*iter==c) { children.erase(iter); break; } iter++; } } void display(int depth) { string str(depth,'-'); str+=name; cout<<str<<endl;
for(vector<Company*>::iterator iter=children.begin(); iter != children.end(); ++iter) { (*iter)->display(depth+2); } }
void lineOfDuty() { for(vector<Company*>::iterator iter=children.begin(); iter != children.end(); ++iter) { (*iter)->lineOfDuty(); } } private: vector<Company*> children; };
int main() { ConcreteCompany *root = new ConcreteCompany("北京总公司"); root->add(new HRDepartment("总公司人力资源部")); root->add(new FinanceDepartment("总公司财务部"));
ConcreteCompany *comp = new ConcreteCompany("上海华东分公司"); comp->add(new HRDepartment("华东分公司人力资源部")); comp->add(new FinanceDepartment("华东分公司财务部")); root->add(comp);
ConcreteCompany *comp1 = new ConcreteCompany("南京办事处"); comp1->add(new HRDepartment("南京办事处人力资源部")); comp1->add(new FinanceDepartment("南京办事处财务部")); comp->add(comp1);
ConcreteCompany *comp2 = new ConcreteCompany("杭州办事处"); comp2->add(new HRDepartment("杭州办事处人力资源部")); comp2->add(new FinanceDepartment("杭州办事处财务部")); comp->add(comp2);
cout<< "\n结构图: " <<endl; root->display(1);
cout<< "\n职责: " <<endl; root->lineOfDuty();
return 0; }
|
Python 实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
class Company(object): def __init__(self, name): self.name = name
def display(depth): pass
def lineOfDuty(): pass
class HRDepartment(Company): def __init__(self, name): super(HRDepartment, self).__init__(name)
def display(self, depth): print '-' * depth + self.name
def lineOfDuty(self): print '{} 员工培训管理'.format(self.name)
class FinanceDepartment(Company): def __init__(self, name): super(FinanceDepartment, self).__init__(name)
def display(self, depth): print '-' * depth + self.name
def lineOfDuty(self): print '{} 公司财务收支管理'.format(self.name)
class ConcreteCompany(Company): def __init__(self, name): self._children = [] super(ConcreteCompany, self).__init__(name)
def add(self, c): self._children.append(c)
def remove(self, c): self._children.remove(c)
def display(self, depth): print '-' * depth + self.name
for item in self._children: item.display(depth + 2)
def lineOfDuty(self): for item in self._children: item.lineOfDuty()
if __name__ == '__main__': root = ConcreteCompany("北京总公司") root.add(HRDepartment("总公司人力资源部")) root.add(FinanceDepartment("总公司财务部"))
comp = ConcreteCompany("上海华东分公司") comp.add(HRDepartment("华东分公司人力资源部")) comp.add(FinanceDepartment("华东分公司财务部")) root.add(comp)
comp1 = ConcreteCompany("南京办事处") comp1.add(HRDepartment("南京办事处人力资源部")) comp1.add(FinanceDepartment("南京办事处财务部")) comp.add(comp1)
comp2 = ConcreteCompany("杭州办事处") comp2.add(HRDepartment("杭州办事处人力资源部")) comp2.add(FinanceDepartment("杭州办事处财务部")) comp.add(comp2)
print '\n结构图:' root.display(1)
print '\n职责:' root.lineOfDuty()
|
执行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 结构图: -北京总公司 ---总公司人力资源部 ---总公司财务部 ---上海华东分公司 -----华东分公司人力资源部 -----华东分公司财务部 -----南京办事处 -------南京办事处人力资源部 -------南京办事处财务部 -----杭州办事处 -------杭州办事处人力资源部 -------杭州办事处财务部
职责: 总公司人力资源部 员工培训管理 总公司财务部 公司财务收支管理 华东分公司人力资源部 员工培训管理 华东分公司财务部 公司财务收支管理 南京办事处人力资源部 员工培训管理 南京办事处财务部 公司财务收支管理 杭州办事处人力资源部 员工培训管理 杭州办事处财务部 公司财务收支管理
|
Tips:
组合模式
的Python
实现没有什么特点,在这就不在赘述了。