• 设计模式-组合模式


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

    下面以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
  • 相关阅读:
    005. gitlab安装
    004. github使用
    003. git标签
    TS标红和报错解决(优化项)
    catalog连接数据库与sde权限问题
    博客新生企划
    HDU 7105 Power Sum
    HDU 7131 Nun Heh Heh Aaaaaaaaaaa
    BZOJ 1691 挑剔的美食家
    洛谷 4254 Blue Mary 开公司
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/11380254.html
Copyright © 2020-2023  润新知