组合模式(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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值