1. 概述
Composite Pattern提供一种模式:通过将多个同一类型的对象组织起来,将一对多的关系简化为一对一的关系。
类图:
2. 实例
餐厅有很多厨师和服务员,每个月最后一个工作日老板发薪,可以将所有餐厅所有员工的信息放在Composite中,每个员工是一个leaf。
代码如下:
#include <iostream> #include <list> #include <algorithm> using namespace std; //component class Emp_pay_base { public: Emp_pay_base() { } virtual ~Emp_pay_base() { } virtual void add(Emp_pay_base*) { } virtual void remove(Emp_pay_base*) { } virtual void pay() = 0; }; //composite class Emp_pay_group : public Emp_pay_base { public: virtual ~Emp_pay_group() { list<Emp_pay_base*>::iterator iter,tmp; for(iter = _emp_list.begin(); iter != _emp_list.end();) { if(*iter) { tmp = iter; iter++; if(*tmp) { delete (*tmp); *tmp = NULL; } } } } virtual void add(Emp_pay_base* emp) { _emp_list.push_back(emp); } virtual void remove(Emp_pay_base* emp) { list<Emp_pay_base*>::iterator iter; iter = find(_emp_list.begin(), _emp_list.end(), emp); while(iter != _emp_list.end()) { _emp_list.erase(iter); } } virtual void pay() { list<Emp_pay_base*>::iterator iter; for(iter = _emp_list.begin(); iter != _emp_list.end(); iter++) { (*iter)->pay(); } } private: list<Emp_pay_base*> _emp_list; }; //leaf class Waiter : public Emp_pay_base { public: Waiter(int salary) { _salary = salary; } virtual ~Waiter() { } virtual void pay() { cout << "Pay waiter salary: " << _salary << endl; } private: int _salary; }; //leaf class Cook : public Emp_pay_base { public: Cook(int salary) { _salary = salary; } virtual ~Cook() { } virtual void pay() { cout << "Pay cook salary: " << _salary << endl; } private: int _salary; }; int main(int argc, char** argv) { Emp_pay_group* pay_group = new Emp_pay_group; Waiter* waiter = new Waiter(2000); Cook* cook = new Cook(5000); pay_group->add(waiter); pay_group->add(cook); pay_group->pay(); delete pay_group; return 0; }
运行输出:
Pay waiter salary: 2000
Pay cook salary: 5000