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

    类图

     

    源码

    package composite;
    
    public interface IFile {
        //下面两个方法,相当于类图中operation方法
        void delete();
        String getName();
        
        /* 以上为公共行为,以下为文件夹才有的行为 */
        
        //创建新文件,相当于add方法
        void createNewFile(String name);
        //相当于remove方法
        void deleteFile(String name);
        //相当于GetChild方法
        IFile getIFile(int index);
    }
    
    Folder.java
    package composite;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Folder implements IFile{
        
        private String name;
        private IFile folder;
        private List<IFile> files;
        
        public Folder(String name) {
            this(name, null);
        }
    
        public Folder(String name,IFile folder) {
            super();
            this.name = name;
            this.folder = folder;
            files = new ArrayList<IFile>();
        }
        
        public String getName() {
            return name;
        }
        
        //与File的删除方法不同,先删除下面的文件以及文件夹后再删除自己
        public void delete() {
            List<IFile> copy = new ArrayList<IFile>(files);
            System.out.println("------------删除子文件-------------");
            for (IFile file : copy) {
                file.delete();
            }
            System.out.println("----------删除子文件结束-------------");
            if (folder != null) {
                folder.deleteFile(name);
            }
            System.out.println("---删除[" + name + "]---");
        }
    
        public void createNewFile(String name) {
            if (name.contains(".")) {
                files.add(new File(name,this));
            }else {
                files.add(new Folder(name,this));
            }
        }
    
        public void deleteFile(String name) {
            for (IFile file : files) {
                if (file.getName().equals(name)) {
                    files.remove(file);
                    break;
                }
            }
        }
    
        public IFile getIFile(int index) {
            return files.get(index);
        }
    
    }
    
    File.java
    package composite;
    
    public class File implements IFile{
        
        private String name;
        private IFile folder;
        
        public File(String name,IFile folder) {
            super();
            this.name = name;
            this.folder = folder;
        }
        
        public String getName() {
            return name;
        }
    
        public void delete() {
            folder.deleteFile(name);
            System.out.println("---删除[" + name + "]---");
        }
    
        //文件不支持创建新文件
        public void createNewFile(String name) {
            throw new UnsupportedOperationException();
        }
        //文件不支持删除文件
        public void deleteFile(String name) {
            throw new UnsupportedOperationException();
        }
        //文件不支持获取下面的文件列表
        public IFile getIFile(int index) {
            throw new UnsupportedOperationException();
        }
    
    }
    
    Client.java
    package composite;
    
    public class Client {
        public static void main(String[] args) {
            IFile root = new Folder("我的电脑");
            root.createNewFile("C盘");
            root.createNewFile("D盘");
            root.createNewFile("E盘");
            IFile D = root.getIFile(1);
            D.createNewFile("project");
            D.createNewFile("电影");
            IFile project = D.getIFile(0);
            project.createNewFile("test1.java");
            project.createNewFile("test2.java");
            project.createNewFile("test3.java");
            IFile movie = D.getIFile(1);
            movie.createNewFile("电影1.avi");
            movie.createNewFile("电影2.avi");
            
            /* 以上为当前文件系统的情况,下面我们尝试删除文件和文件夹 */
            display(null, root);
            System.out.println();
            
            project.delete();
            movie.getIFile(1).delete();
            
            System.out.println();
            display(null, root);
        }
        
        //打印文件系统
        public static void display(String prefix,IFile iFile){
            if (prefix == null) {
                prefix = "";
            }
            System.out.println(prefix + iFile.getName());
            if(iFile instanceof Folder){
                for (int i = 0; ; i++) {
                    try {
                        if (iFile.getIFile(i) != null) {
                            display(prefix + "--", iFile.getIFile(i));
                        }
                    } catch (Exception e) {
                        break;
                    }
                }
            }
        }
    
    }

    测试截图

     

     

  • 相关阅读:
    web安全
    WCF通信架构
    WCF地址
    WCFContracts(契约)
    分布式中的王者WCF
    SOAP 介绍
    诊所管理软件
    MFC 画图CDC双缓冲
    Linux 启动、关闭、重启网络服务
    C# 除法的小数点问题
  • 原文地址:https://www.cnblogs.com/lx06/p/15688408.html
Copyright © 2011-2022 走看看