实验10:组合模式

实验10:组合模式

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

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

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

 
   

 


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

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

实验要求:

1.文件的执行不需真正实现,只

2.提交源代码;

 

 

JAVA

package rjsj.no10;

public class Client {

    public static void main(String[] args) {

        AbstractFile obj1,obj2,obj3,obj4,obj5;

        Folder plate1,plate2,plate3;

        obj1 = new ImageFile("图片文件1");

        obj2 = new TextFile("文本文件1");

        plate1 = new Folder("父文件夹1");

        plate1.add(obj1);

        plate1.add(obj2);

        obj3 = new VideoFile("视频文件1");

        obj4 = new Folder("子文件夹1");

        plate2 = new Folder("父文件夹2");

        plate2.add(obj3);

        plate2.add(obj4);

        obj5 = new TextFile("文本文件2");

        plate3 = new Folder("父文件夹3");

        plate3.add(obj5);

        plate3.add(plate1);

        plate3.add(plate2);

        plate3.display();

    }

}

package rjsj.no10;

import java.util.ArrayList;

public class Folder extends AbstractFile{

    private String fileName;

    private ArrayList fileList=new ArrayList();

    public Folder(String filename) {

        this.fileName=new String();

        this.fileName=filename;

    }

    @Override

    public void add(AbstractFile element) {

        fileList.add(element);

        System.out.println("新建文件夹");

    }

    @Override

    public void remove(AbstractFile element) {

        fileList.remove(element);

        System.out.println("删除文件夹");

    }

    @Override

    public void display() {

        for (Object obj:fileList){

            ((AbstractFile)obj).display();

        }

        System.out.println("打开文件夹");

    }

} package rjsj.no10;

public class ImageFile extends AbstractFile{

    private String fileName;

    public ImageFile(String filename) {

        this.fileName=new String();

        this.fileName=filename;

    }

    @Override

    public void add(AbstractFile element) {

        System.out.println("添加图片文件");

    }

    @Override

    public void remove(AbstractFile element) {

        System.out.println("移除图片文件");

    }

    @Override

    public void display() {

        System.out.println(fileName);

        System.out.println("打开图片文件");

    }

}

package rjsj.no10;

public class TextFile extends AbstractFile{

    private String fileName;

    public TextFile(String filename) {

        this.fileName=new String();

        this.fileName=filename;

    }

    @Override

    public void add(AbstractFile element) {

        System.out.println("添加文本文件");

    }

    @Override

    public void remove(AbstractFile element) {

        System.out.println("移除文本文件");

    }

    @Override

    public void display() {

        System.out.println(fileName);

        System.out.println("打开文本文件");

    }

}

package rjsj.no10;

public class VideoFile extends AbstractFile{

    private String fileName;

    public VideoFile(String filename) {

        this.fileName=new String();

        this.fileName=filename;

    }

    @Override

    public void add(AbstractFile element) {

        System.out.println("添加视频文件");

    }

    @Override

    public void remove(AbstractFile element) {

        System.out.println("移除视频文件");

    }

    @Override

    public void display() {

        System.out.println(fileName);

        System.out.println("播放视频文件");

    }

}

package rjsj.no10;

public abstract class AbstractFile {

    public abstract void add(AbstractFile element);

    public abstract void remove(AbstractFile element);

    public abstract void display();

}

C++

#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" << endl;

    }

    void remove(AbstractFile* element) {

        cout << "关闭VideoFile" << endl;

    }

    void display() {

        cout << "浏览VideoFile" << endl;

    }

    void displayFile() {

        cout << "VideoFile的内容" << endl;

    }

};

class TextFile :public AbstractFile {

private:

    string fileName;

public:

    TextFile(string fileName) {

        this->fileName = fileName;

    }

    void add(AbstractFile* element) {

        cout << "打开" <<this->fileName<< endl;

    }

    void remove(AbstractFile* element) {

        cout << "关闭" << this->fileName<<endl;

    }

    void display() {

        cout << "浏览" << this->fileName<<endl;

    }

    void displayFile() {

        cout <<this->fileName<< "的内容" << endl;

    }

};

class ImageFile :public AbstractFile {

private:

    string fileName;

public:

    ImageFile(string fileName) {

        this->fileName = fileName;

    }

    void add(AbstractFile* element) {

        cout << "打开" <<this->fileName<< endl;

    }

    void remove(AbstractFile* element) {

        cout << "关闭"<<this->fileName << endl;

    }

    void display() {

        cout << "浏览"<<this->fileName << endl;

    }

    void displayFile() {

        cout <<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) {

        _list->push_back(element);

    }

    void remove(AbstractFile* element) {

        cout << "关闭"<<this->fileName;

        _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");

    cout << "打开Folder1";

    plate1->add(obj1);

    plate1->add(obj2);

    plate1->display();

    obj3 = new VideoFile("VideoFile");

    cout << "打开Folder2";

    plate2 = new Folder("folder2");

    plate2->add(obj3);

    plate2->display();

    plate1->remove(obj1);

    plate1->remove(obj3);

}

 

3.注意编程规范。

posted @ 2022-10-31 11:35  萧贾jzm  阅读(52)  评论(0编辑  收藏  举报
//歌单id