2023/11/27周一总结

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

 

实验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();

}

posted @   liu_ru_jun  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示