软件设计——组合模式之文件夹浏览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、运行截图

posted @ 2021-11-17 13:05  第厘  阅读(90)  评论(0编辑  收藏  举报