组合模式

软件设计                  石家庄铁道大学信息学院

 

实验10:组合模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解组合模式的动机,掌握该模式的结构;

2、能够利用组合模式解决实际问题。

 
   

 

 

[实验任务一]:组合模式

用透明组合模式实现教材中的“文件夹浏览”这个例子。

实验要求:

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();
}

 

 

 

 

 

3.注意编程规范。

 

 

posted @ 2021-10-27 11:33  我试试这个昵称好使不  阅读(143)  评论(0编辑  收藏  举报