设计模式之组合模式(Composite)

来源:互联网 发布:mac更换登录帐号 编辑:程序博客网 时间:2024/06/12 23:31

优点:1)组合模式使基本对象组合成复杂对象,复杂对象继续组合,形成递归
2)组合模式可以让客户使用一致的组合对象和单个对象

#include <iostream>#include <vector>using namespace std;//纯虚函数,只提供接口,没有默认的实现class Base{public:    virtual void Operation(){}    virtual void add(Base *){}    virtual Base *getChild(int){return NULL;}    virtual ~Base(){}protected:    string _name;};//Leaf是叶子结点,也就是不含有子组件的结点类,所以不用实现Add、Remove、GetChild等方法class Leaf : public Base{public:    void Operation(){cout<< "Leaf name:" << _name.c_str() <<endl;}    Leaf(string name){_name = name;}    ~Leaf(){}};class Composite : public Base{public:    Composite(string name){_name = name;}    ~Composite(){}    void Operation()    {        cout<< "Composite name:" << _name.c_str() <<endl;        for(int i = 0; i < _baseVector.size(); ++i)            _baseVector.at(i)->Operation();    }    void add(Base *base){_baseVector.push_back(base);}    Base *getChild(int index)    {        if(index < 0 && index > _baseVector.size())            return NULL;        return _baseVector[index];    }private:    vector<Base*> _baseVector;};int main(){    Base *root = new Composite("root");    Base *a = new Leaf("a");    Base *b = new Leaf("b");    Base *c = new Leaf("c");    Base *composite = new Composite("composite");    composite->add(a);    composite->add(b);    root->add(c);    root->add(composite);    root->Operation();    return 0;}

运行结果:
Composite name:root
Leaf name:c
Composite name:composite
Leaf name:a
Leaf name:b