软件设计——组合模式之文件夹浏览C++
1、类图
2、代码
#include <iostream>
#include <string>
#include<list>
using namespace std;
class AbstractFile
{
public:
virtual void add(AbstractFile* abstractfile) { }
virtual void remove(AbstractFile* abstractfile) { }
virtual void display() { }
};
class ImageFile: public AbstractFile
{
private:
string fileName;
public:
ImageFile(string filename)
{
fileName = filename;
}
void add(AbstractFile* abstractfile)
{
cout << "添加成功" << endl;
}
void remove(AbstractFile* abstractfile)
{
cout << "删除成功" << endl;
}
void display()
{
cout << fileName << endl;
}
};
class TextFile : public AbstractFile
{
private:
string fileName;
public:
TextFile(string filename)
{
fileName = filename;
}
void add(AbstractFile* abstractfile)
{
cout << "添加成功" << endl;
}
void remove(AbstractFile* abstractfile)
{
cout << "删除成功" << endl;
}
void display()
{
cout << fileName << endl;
}
};
class VideoFile : public AbstractFile
{
private:
string fileName;
public:
VideoFile(string filename)
{
fileName = filename;
}
void add(AbstractFile* abstractfile)
{
cout << "添加成功" << endl;
}
void remove(AbstractFile* abstractfile)
{
cout << "删除成功" << endl;
}
void display()
{
cout << fileName << endl;
}
};
class Folder: public AbstractFile
{
private:
string fileName;
int level;
list<AbstractFile*> abstractfiles;
public:
Folder(string filename)
{
fileName = filename;
}
Folder(string filename,int level)
{
fileName = filename;
this->level = level;
}
void add(AbstractFile* abstractfile)
{
abstractfiles.push_front(abstractfile);
}
void remove(AbstractFile* abstractfile)
{
abstractfiles.remove(abstractfile);
}
void display()
{
cout << fileName << endl;
list<AbstractFile*>::iterator iter = abstractfiles.begin();
for (; iter != abstractfiles.end(); iter++)
{
if (this->level != 1)
{
cout << " +" ;
(*iter)->display();
}
else {
cout << " *" ;
(*iter)->display();
}
}
}
};
int main()
{
AbstractFile* obj1 = new ImageFile("中国地图.png");
AbstractFile* obj2 = new TextFile("中国地貌概览.txt");
Folder* fold1 = new Folder("中国地理", 1);
/*中国地理中有中国地图.png和中国地貌概览.txt*/
fold1->add(obj1);
fold1->add(obj2);
AbstractFile* obj3 = new VideoFile("唐朝文化简介.mp3");
AbstractFile* obj4 = new VideoFile("明朝文化简介.mp3");
Folder* fold2 = new Folder("中国古代文化", 1);
/*中国古代文化里有唐朝文化简介.mp3和明朝文化简介.mp3*/
fold2->add(obj3);
fold2->add(obj4);
AbstractFile* obj5 = new ImageFile("长城.png");
AbstractFile* obj6 = new TextFile("故宫历史简介.txt");
Folder* fold3 = new Folder("中国地理文化知识");
fold3->add(fold1);
fold3->add(fold2);
fold3->add(obj5); //中国地理文化知识里有中国地理、中国古代文化、长城.png和故宫历史简介.txt
fold3->add(obj6);
fold3->display();
delete obj1, obj2, obj3, obj4,obj5, obj6;
delete fold1, fold2, fold3;
}
3、运行截图