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
  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/chenpi/p/5196870.html
Copyright © 2011-2022 走看看