• 设计模式(二十七)------23种设计模式(19):组合模式


    使用频率:★★★★☆

    一、什么是组合模式

    树形结构的实现,用于描述“整体-部分”的关系;

    二、补充说明

    使用场景:部分/整体场景,如树形菜单; 文件/文件夹; 树形结构的公司层级关系...

    三、角色

    抽象角色

    叶子角色

    树枝角色

    客户端角色

    四、例子,JAVA实现

    利用组合模式实现如下文件/文件夹的树形结构关系;

    抽象角色,抽象文件: 具体文件和具体文件夹都继承该抽象文件角色

    复制代码
    package com.pichen.dp.structuralpattern.combination;
    public abstract class File {
    
        protected String name;
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public abstract void showFileName();
        
        
    }
    复制代码

    树枝角色:具体文件夹

    复制代码
    package com.pichen.dp.structuralpattern.combination;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Folder extends File{
    
        
        private List<File> fileList = new ArrayList<File>();
        
        public Folder(String name) {
            this.name = name;
        }
        @Override
        public void showFileName() {
            System.out.println(this.name);
        }
    
        public void addFile(File file){
            fileList.add(file);
        }
        
        //打印文件夹下的文件名
        public void displayFiles(){
            for(File file : this.fileList){
                file.showFileName();
            }
        }
    }
    复制代码

    叶子角色:具体文件

    复制代码
    package com.pichen.dp.structuralpattern.combination;
    public class TXTFile extends File{
    
        public TXTFile(String name) {
            this.name = name;
        }
        
        @Override
        public void showFileName() {
            System.out.println(this.name);
            
        }
    
    }
    复制代码
    复制代码
    package com.pichen.dp.structuralpattern.combination;
    public class AVIFile extends File{
        public AVIFile(String name) {
            this.name = name;
        }
    
        @Override
        public void showFileName() {
            System.out.println(this.name);
        }
    }
    复制代码

    客户端,模拟文件/文件夹树形结构

    复制代码
    package com.pichen.dp.structuralpattern.combination;
    public class Main {
    
        public static void main(String[] args) {
            Folder folder = new Folder("一级目录");
            File txtFile = new TXTFile("二级文件txt");
            File aviFile = new AVIFile("二级文件avi");
            Folder txtFolder = new Folder("二级txt目录");
            Folder aviFolder = new Folder("二级avi目录");
    
            File txtFile1 = new TXTFile("三级文件txt1");
            File txtFile2 = new TXTFile("三级文件txt2");
            File txtFile3 = new TXTFile("三级文件txt3");
            File aviFile1 = new AVIFile("三级文件avi1");
            File aviFile2 = new AVIFile("三级文件avi2");
            
            folder.addFile(txtFile);
            folder.addFile(aviFile);
            folder.addFile(txtFolder);
            folder.addFile(aviFolder);
            
            txtFolder.addFile(txtFile1);
            txtFolder.addFile(txtFile2);
            txtFolder.addFile(txtFile3);
            
            aviFolder.addFile(aviFile1);
            aviFolder.addFile(aviFile2);
            
            System.out.println("一级目录下的文件:");
            folder.displayFiles();
            System.out.println("
    二级txt目录下的文件:");
            txtFolder.displayFiles();
            System.out.println("
    二级avi目录目录下的文件:");
            aviFolder.displayFiles();
        }
    }
    复制代码

    打印结果:

    复制代码
    一级目录下的文件:
    二级文件txt
    二级文件avi
    二级txt目录
    二级avi目录
    
    二级txt目录下的文件:
    三级文件txt1
    三级文件txt2
    三级文件txt3
    
    二级avi目录目录下的文件:
    三级文件avi1
    三级文件avi2
    复制代码

    @Author      风一样的码农
    @HomePageUrl http://www.cnblogs.com/chenpi/ 
    @Copyright      转载请注明出处,谢谢~ 
  • 相关阅读:
    设计模式-状态模式
    Nginx相关
    Docker基础使用
    JavaScript定时器及回调用法
    前端交互篇
    基于ConcurrentHashMap的本地缓存
    J.U.C体系进阶(五):juc-collections 集合框架
    J.U.C体系进阶(四):juc-sync 同步器框架
    J.U.C体系进阶(三)- juc-atomic 原子类框架
    .net core https 双向验证
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9380959.html
Copyright © 2020-2023  润新知