案例:如下目录结构,
|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;
}
编译运行: