组合模式(Composite)

意图
将对象组合成树形结构以表示"部分-整体"的层次结构。
使得用户对单个对象和组合对象的使用更具有一致性。

类图

 

参与者
  • Component
    为组合中的对象声明接口
    在适当的情况下,实现所有类共有接口的缺省行为。
    声明一个接口用于访问和管理Component的子组件
    (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适情况下实现它。
  • Leaf
    在组合中表示叶节点对象,叶节点没有子节点。
    在组合中定义对象的行为。
  • Composite
    定义有子部件的的那些部件的行为
    存储子部件
    在Component接口中实现与子部件有关的操作。
  • Client
    通过Component接口操纵组合部件的对象
代码:还有错。。。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Component
{
protected:
    string name;
public:
    virtual void Add(Component *c);
    virtual void Remove(Component *c);
    virtual void Display(int depth);

    Component(string name)
    {
        this->name = name;
    }
};
class Composite:public Component
{
private:
    vector<Component *> children;
public:
    Composite(string name):Component(name)
    {
         
    }
    void Add(Component *c)
    {
        children.push_back(c);
    }
    void Remove(Component *c)
    {
        //children.delete(c);
    }
    void Display(int depth)
    {
        for(int i=0; i<depth; i++)
            cout<<"-";
        cout<<name<<endl;

        for(vector<Component *>::iterator iter = children.begin(); iter!=children.end(); iter++)
        {
            (*iter)->Display(depth+2);
        }
    }
};

class Leaf:public Component
{
 public:
    Leaf(string name):Component(name)
    {

    }
    void Display(int depth)
    {
        for(int i=0; i<depth; i++)
            cout<<"-";
        cout<<name<<endl;
    }   
};
int main()
{
    Composite *root = new Composite("root");
    root->Add(new Leaf("Leaf A"));
    root->Add(new Leaf("Leaf B"));

    Composite *comp = new Composite("Composite X");
    comp->Add(new Leaf("Leaf XA"));
    comp->Add(new Leaf("Leaf xB"));

    root->Add(comp);
    root->Display(1);
}






posted @ 2013-11-15 08:42  tanhaiyuan  阅读(165)  评论(0编辑  收藏  举报