现在的位置: 首页 > 综合 > 正文

餐馆那些事之:Composit Pattern

2014年02月12日 ⁄ 综合 ⁄ 共 1590字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.