zoukankan      html  css  js  c++  java
  • 【设计模式】组合模式

    使用频率:★★★★☆

    一、什么是组合模式

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

    二、补充说明

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

    三、角色

    抽象角色

    叶子角色

    树枝角色

    客户端角色

    四、例子,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
  • 相关阅读:
    【Nginx】开启 gzip和缓存
    webpack分离css单独打包
    【转】为什么Github没有记录你的Contributions
    Swiper使用遇到的问题
    Jenkins 自动化构建
    Pre标签 自动换行
    Gulp入门教程
    计数排序
    直接插入排序
    等差素数列
  • 原文地址:https://www.cnblogs.com/chenpi/p/5196870.html
Copyright © 2011-2022 走看看