首页 > 其他分享 >软件设计-组合模式

软件设计-组合模式

时间:2022-11-04 15:58:47浏览次数:55  
标签:组合 软件设计 void AbstractFile 模式 fileName add element public

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

 

类图

 

 

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

 

 

运行截图

标签:组合,软件设计,void,AbstractFile,模式,fileName,add,element,public
From: https://www.cnblogs.com/wlqyyds/p/16858079.html

相关文章

  • 软件设计-桥接模式
    两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。 类图  java  packagerjsj.no9;publicclassCar......
  • 软件设计-外观模式
    计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Har......
  • 软件设计-职责链模式
    财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审......
  • 软件设计-代理模式
    婚介所婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。 ......
  • 软件设计-享元模式
    围棋设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。 类图  Java  packagerjsj.no13;/***客户......
  • 软件设计-命令模式 _
    多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运......
  • 软件设计-迭代器模式
    JAVA和C++常见数据结构迭代器的使用信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从......
  • 封装几个有用的 Vue3 组合式API
    https://juejin.cn/post/6888925879243079687本文将介绍如何使用Vue3来封装一些比较有用的组合API,主要包括背景、实现思路以及一些思考。就我自己的感觉而言,Hook与Compos......
  • 行为型设计模式之访问者模式
    访问者模式访问者模式属于行为型模式。它是一种将数据结构与数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定......
  • 广州华锐互动:虚拟现实技术打造安全事故模拟体验新模式
    随着我国的不断发展和文明程度的不断提高,安全问题越来越受到重视。对于安全事故的预防处理,作业人员每年都需要进行至少一次的安全教育培训和考核,但是很多事故无法亲身经历,......