组合模式:通过递归的方式来构建树形的对象结构,并通过一个对象来访问整个对象树。
Component (树形结构的节点抽象)
- 为所有的对象定义统一的接口(公共属性,行为等的定义)
- 提供管理子节点对象的接口方法
- [可选]提供管理父节点对象的接口方法
Leaf (树形结构的叶节点)
Component 的实现子类
Composite(树形结构的枝节点)
Component 的实现子类
组合模式使单个对象和组合对象的使用具有一致性,将对象组合成树形结构以表示“整体-部分”
class FileObj {
public:
virtual void display() = 0;
virtual int add(FileObj* ifile) = 0;
virtual int remove(FileObj* ifile) = 0;
virtual list<FileObj*>* getChild() = 0;
};
class File :public FileObj {
public:
File(string name) {
m_name = name;
}
void display() {
cout << m_name << endl;
}
int add(FileObj* ifile) {
return -1;
}
int remove(FileObj* ifile) {
return -1;
}
list<FileObj*>* getChild() {
return NULL;
}
private:
string m_name;
};
class Folder :public FileObj {
public:
Folder(string name) {
m_name = name;
m_list = new list<FileObj*>;
m_list->clear();
}
void display() {
cout << m_name << endl;
}
int add(FileObj* ifile) {
m_list->push_back(ifile);
return 0;
}
int remove(FileObj* ifile) {
m_list->remove(ifile);
return 0;
}
list<FileObj*>* getChild() {
return m_list;
}
private:
string m_name;
list<FileObj*>* m_list;
};
void dsiplayTree(FileObj* root, int level) {
for (int i = 0; i < level; i++) {
printf("\t");
}
root->display();
list<FileObj*>* l = root->getChild();
if (l != NULL) {
for (list<FileObj*>::iterator it = l->begin(); it != l->end(); it++)
{
if ((*it)->getChild() == NULL)
{
for (int i = 0; i <= level; i++) //注意 <=
{
printf("\t");
}
(*it)->display();
}
else
{
dsiplayTree((*it), level + 1);
}
}
}
}
int main()
{
Folder* root = new Folder("C:");
Folder* dir1 = new Folder("111dir");
File* txt1 = new File("aaa.txt");
Folder* dir12 = new Folder("222dir");
File* txt12 = new File("222.txt");
root->add(dir1);
root->add(txt1);
dir1->add(dir12);
dir1->add(txt12);
/* list<FileObj*>* l = root->getChild();
for (list<FileObj*>::iterator it = l->begin(); it != l->end(); it++)
{
(*it)->display();
}*/
dsiplayTree(root, 0);
delete txt12;
delete dir12;
delete dir1;
delete txt1;
delete root;
system("pause");
return 0;
}