• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
戈瑾
博客园    首页    新随笔    联系   管理    订阅  订阅
组合模式——C++实现

问题描述:

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

类图:

 

 

C++代码:

 

#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;
}

运行结果:

 

posted on 2021-10-06 08:21  戈瑾  阅读(168)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3