设计模式-组合模式

在使用组合模式中需要注意一点也是组合模式最关键的地方:叶子对象和组合对象实现相同的接口。这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。

下面以File为例,文件夹里有文件和子文件夹,不管是文件还是文件夹,他们都继承了相同的接口FIle

类图

 

1.创建FIle抽象类

package com.design.demo.composite;

/**
 * @author: GuanBin
 * @date: Created in 下午10:26 2019/8/18
 */
public abstract class File {
    String name;

    public File(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void display();
}

 

2.创建Folder继承File

package com.design.demo.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: GuanBin
 * @date: Created in 下午10:30 2019/8/18
 */
public class Folder extends File {

    private List<File> files;

    public Folder(String name) {
        super(name);
        this.files = new ArrayList<>();
    }

    /**
     * 浏览文件夹中的文件信息
     */
    @Override
    public void display() {
        for (File file : files) {
            file.display();
        }
    }

    /**
     * 向文件夹中添加文件
     *
     * @param file
     */
    public void add(File file) {
        files.add(file);
    }


    /**
     * 从文件夹中删除文件
     *
     * @param file
     */
    public void remove(File file) {
        files.remove(file);
    }
}

 

3.创建ImageFile继承File

package com.design.demo.composite;

/**
 * @author: GuanBin
 * @date: Created in 下午10:50 2019/8/18
 */
public class ImageFile extends File {
    public ImageFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        System.out.println("这是图像文件,文件名:"+super.name);
    }
}

 

4.创建TextFile继承FIle

package com.design.demo.composite;

/**
 * @author: GuanBin
 * @date: Created in 下午10:50 2019/8/18
 */
public class TextFile extends File {
    public TextFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        System.out.println("这是文本文件,文件名:"+super.name);
    }
}

 

5.创建VideoFile继承File

package com.design.demo.composite;

/**
 * @author: GuanBin
 * @date: Created in 下午10:50 2019/8/18
 */
public class VideoFile extends File {
    public VideoFile(String name) {
        super(name);
    }

    @Override
    public void display() {
        System.out.println("这是影像文件,文件名:"+super.name);
    }
}

 

6.创建Client

package com.design.demo.composite;

/**
 * @author: GuanBin
 * @date: Created in 下午10:53 2019/8/18
 */
public class Client {

    public static void main(String[] args) {
        Folder folder = new Folder("总文件夹");
        folder.add(new TextFile("text.txt"));
        folder.add(new ImageFile("image.jpg"));


        Folder testFolder = new Folder("test文件夹");
        testFolder.add(new TextFile("test1.txt"));
        testFolder.add(new ImageFile("test2.jpg"));
        testFolder.add(new VideoFile("test3.rmvb"));

        //把test文件夹添加到总文件夹下
        folder.add(testFolder);
        //遍历
        folder.display();
        System.out.println("*****************************");
        //添加
        TextFile addFile = new TextFile("add.txt");
        testFolder.add(addFile);
        folder.display();
        System.out.println("*****************************");
        //删除testFolder
        folder.remove(testFolder);
        folder.display();

    }


}

 输出

这是文本文件,文件名:text.txt
这是图像文件,文件名:image.jpg
这是文本文件,文件名:test1.txt
这是图像文件,文件名:test2.jpg
这是影像文件,文件名:test3.rmvb
*****************************
这是文本文件,文件名:text.txt
这是图像文件,文件名:image.jpg
这是文本文件,文件名:test1.txt
这是图像文件,文件名:test2.jpg
这是影像文件,文件名:test3.rmvb
这是文本文件,文件名:add.txt
*****************************
这是文本文件,文件名:text.txt
这是图像文件,文件名:image.jpg

Process finished with exit code 0

 

posted @ 2019-08-19 22:38  纵码万水千山  阅读(142)  评论(0编辑  收藏  举报