实验10:组合模式--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 << "add ImageFile" << endl; } void remove(AbstractFile* abstractfile) { cout << "remove ImageFile" << endl; } void display() { cout << fileName <<" ImageFile"<< endl; } }; class TextFile : public AbstractFile { private: string fileName; public: TextFile(string filename) { fileName = filename; } void add(AbstractFile* abstractfile) { cout << "add TextFile" << endl; } void remove(AbstractFile* abstractfile) { cout << "remove TextFile" << endl; } void display() { cout << fileName <<" TextFile"<< endl; } }; class VideoFile : public AbstractFile { private: string fileName; public: VideoFile(string filename) { fileName = filename; } void add(AbstractFile* abstractfile) { cout << "add VideoFile" << endl; } void remove(AbstractFile* abstractfile) { cout << "remove VideoFile" << endl; } void display() { cout << fileName <<" VideoFile"<< 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,*obj2,*obj3,*obj4; Folder *fold1,*fold2,*fold3; obj1 = new ImageFile("a.jpg"); obj2 = new TextFile("b.txt"); fold1 = new Folder("Image_Text", 1); fold1->add(obj1); fold1->add(obj2); obj3 = new VideoFile("c.mp4"); fold2 = new Folder("Image_Video", 1); fold2->add(obj1); fold2->add(obj3); obj4 = new ImageFile("d.jpg"); fold3 = new Folder("Image_Text_Video_Folder"); fold3->add(fold1); fold3->add(fold2); fold3->add(obj4); fold3->display(); delete obj1, obj2, obj3, obj4; delete fold1, fold2, fold3; }
运行截图: