软件设计 石家庄铁道大学信息学院
实验10:组合模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解组合模式的动机,掌握该模式的结构;
2、能够利用组合模式解决实际问题。
[实验任务一]:组合模式
用透明组合模式实现教材中的“文件夹浏览”这个例子。
实验要求:
1.文件的执行不需真正实现,只需简单提示即可;
2.提交源代码;
3.注意编程规范。
1:类图:
2:源代码:
#include<iostream>
#include<string>
#include<list>
using namespace std;
class AbstractFile {
public:
virtual void add(AbstractFile* element) = 0;
virtual void remove(AbstractFile* element) = 0;
virtual void display() = 0;
};
class VideoFile : public AbstractFile {
private:
string fileName;
public:
VideoFile(string fileName) {
this->fileName = fileName;
}
void add(AbstractFile* element) {
cout << "VideoFile:add -> " << this->fileName << endl;
}
void remove(AbstractFile* element) {
cout << "VideoFile:remove -> " << this->fileName << endl;
}
void display() {
cout << "VideoFile:display -> " << this->fileName << endl;
}
};
class TextFile :public AbstractFile {
private:
string fileName;
public:
TextFile(string fileName) {
this->fileName = fileName;
}
void add(AbstractFile* element) {
cout << "TextFile:add -> " << this->fileName << endl;
}
void remove(AbstractFile* element) {
cout << "TextFile:remove -> " << this->fileName << endl;
}
void display() {
cout << "TextFile:display -> " << this->fileName << endl;
}
};
class ImageFile :public AbstractFile {
private:
string fileName;
public:
ImageFile(string fileName) {
this->fileName = fileName;
}
void add(AbstractFile* element) {
cout << "ImageFile:add -> " << this->fileName << endl;
}
void remove(AbstractFile* element) {
cout << "ImageFile:remove -> " << this->fileName << endl;
}
void display() {
cout << "ImageFile:display -> " << this->fileName << endl;
}
};
class Folder :public AbstractFile {
private:
list<AbstractFile*>* _list;
string fileName;
public:
Folder(string fileName) {
this->fileName = fileName;
_list = new list<AbstractFile*>;
}
~Folder() {
if (_list != NULL)
{
while (_list->empty()) {
delete* (_list->begin());
_list->erase(_list->begin());
}
delete _list;
}
}
string getFileName() const {
return fileName;
}
void add(AbstractFile* element) {
cout << "Folder:add";
element->display();
_list->push_back(element);
}
void remove(AbstractFile* element) {
cout << "Folder:remove";
element->display();
_list->remove(element);
}
void display() {
if (_list != NULL) {
list<AbstractFile*>::iterator it = _list->begin();
while (it != _list->end()) {
(*it++)->display();
}
}
}
};
int main() {
AbstractFile* obj1, * obj2, * obj3, * obj4;
Folder* plate1, * plate2;
obj1 = new ImageFile("ImageFile");
obj2 = new TextFile("TextFile");
plate1 = new Folder("folder1");
plate1->add(obj1);
plate1->add(obj2);
cout << "-------------plate1中文件内容-----------------" << endl;
plate1->display();
cout << "------------------------------" << endl;
obj3 = new VideoFile("VideoFile");
plate2 = new Folder("folder2");
plate2->add(obj3);
cout << "-------------plate2中文件内容-----------------" << endl;
plate2->display();
cout << "------------------------------" << endl;
plate1->remove(obj1);
cout << "-------------plate1中文件内容-----------------" << endl;
plate1->display();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!