Composite(组合)模式

案例:如下目录结构,
|libevent/
|—-compat/
|——–sys/
|————queue.h
|—-epoll.c

  这是一个树形结构,它适合用组合模式表达。组合模式是类构造型设计模式之一,通过递归方法来构造对象的结构,并可以通过一个对象来访问整个对象树。
  组合模式UML图:
这里写图片描述
  component(树形结构的抽象节点):1)为所有的对象定义统一的接口;
2)提供管理子节点对象的接口方法;3)提供管理父节点对象的接口方法(可选);
leaf(树形结构的叶节点),component的实现子类。
  组合模式适用于单个对象和组合对象具有一致性,将这些对象组合成树形结构以表示部分和整体

class absFile
{
public:
    virtual void show() = 0;
    virtual int add(absFile* f) = 0;
    virtual int remove(absFile* f) = 0;
    virtual list<absFile*>* getChild() = 0;
};

class File : public absFile
{
private:
    string m_name;

public:
    File(string name) { m_name = name;  }   
    void show() { cout << m_name << endl; }
    int add(absFile* f) { return -1; }  
    int remove(absFile* f) { return -1; }   
    list<absFile*>* getChild() { return NULL; }
};

class Dir : public absFile
{
private:
    string m_name;
    list<absFile*>* m_vector;

public:
    Dir(string name)
    {
        m_name = name;
        m_vector = new list<absFile*>;
        m_vector->clear();
    }

    void show()
    {
        cout << m_name << endl;
    }

    int add(absFile* f)
    {
        m_vector->push_back(f);
        return 0;
    }   

    int remove(absFile* f)
    {
        m_vector->remove(f);
        return 0;
    }

    list<absFile*>* getChild()
    {
        return m_vector;
    }
};

void showDirTree(absFile* root, int level)
{
    list<absFile*> *l = NULL;

    root->show();

    for (unsigned char i = 0; i < level; ++i) cout << "--"; 

    l = root->getChild();
    if (l)
    {
        for (list<absFile*>::iterator it = l->begin(); it != l->end(); ++it)
        {
            if ((*it)->getChild() == NULL)  //文件
            {
                (*it)->show();
            }
            else                            //目录
                showDirTree((*it), level + 1);
        }
    }
}

int main(void)
{
    Dir* root = new Dir("libevent");
    Dir* dir1 = new Dir("compat");
    Dir* dir2 = new Dir("sys");
    File* file1 = new File("quue.h");
    File* file2 = new File("epoll.c");

    root->add(dir1);
    root->add(file2);

    dir1->add(dir2);
    dir2->add(file1);

    showDirTree(root, 0);

    delete file2;
    delete file1;
    delete dir2;
    delete dir1;
    delete root;

    return 0;
}

  编译运行:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值