1.废话

​ 上次io流联系的时候,有一个地方有待优化,计划使用代理模式。恰逢开始写博客,着闲着也是闲着记录一下丰富一下我的博客记录,之前看过一些网上其他的代理的讲解都很高端,我这技术有限只说一下自己理解的代理模式

2. 背景

​ 之前统计项目中废没在被使用的VUE文件时写了一个遍历文件夹的方法,后来清理废弃方法时再次需要用到了递归文件夹的场景,重新写一次肯定是没问题的,但之后可能还会再次使用。在设计的角度来说,递归文件夹这个操作属于常用操作应该抽象为工具类,为了实现功能改动工具类中的代码是不合理的,先看旧版代码

    public static void   traverseFolders(File[] files, String  after) {      //遍历文件夹
        for (File file : files) {
            //当前文件为文件夹时
            if (file.isDirectory()) {
                //获得该文件夹下的所有文件以及文件夹
                File[] files1 = file.listFiles();
                if (files1 != null) {
                    traverseFolders(files1, after +"/"+file.getName());
                }
            } else {
                //以下为便利需要执行的特殊逻辑
                Boolean flag1;
                Boolean flag2;
                String read = ioRead.readCode( file );
                List<String> functions = dealStr.getFunctionList(read);
                HashMap<String, Boolean> map = new HashMap<>();
                for (String f : functions) {
                    flag1 =read.replace(f+"(","").length()+f.length()+1!=read.length();
                    flag2 =read.replace("\""+f+"\"","").length()!=read.length();
                    map.put(f,flag1||flag2);
                }
                String path ="C:\\Users\\22177\\Desktop\\io流\\无用方法.txt";
                for (Map.Entry<String, Boolean> function : map.entrySet()) {
                    if (!function.getValue()){
                        ioWrite.log(after+"/"+file.getName()+"中的"+function.getKey()+"没有被引用",path);
                    }
                }
            }
        }
    }

3.开写

先定义一个接口作为作为代理的参数

public interface Iodeal {
    public abstract void prtFile(String after, File file);
}

然后将上面原来方法中的特殊操作的部分交给我们定义的代理接口来

    private static Iodeal iodeal=null ;
    /***
     *
     * @param io 代理操作类
     * @param filePathTxt 文件夹路径
     * @param after 前缀
     */
    public static void traverseDela(Iodeal io,String  filePathTxt, String  after){
        File file = new File(filePathTxt);
        File[] files = file.listFiles();
        //写之前进行清空操作
        IoWrite.clearTxt("C:\\Users\\22177\\Desktop\\io流\\无用方法.txt");
        iodeal=io;
        traverseFolders(files,after);
    }

    public static void   traverseFolders(File[] files, String  after) {      //遍历文件夹
        for (File file : files) {
            //当前文件为文件夹时
            if (file.isDirectory()) {
                //获得该文件夹下的所有文件以及文件夹
                File[] files1 = file.listFiles();
                if (files1 != null) {
                    traverseFolders(files1, after +"/"+file.getName());
                }
            } else {
                //这里原来是特殊操作
                iodeal.prtFile(after, file);
            }
        }
    }

然后进行调用,调用时重写接口里面的方法

 public static void main(String[] args) {

            IoFolder.traverseDela(new Iodeal() {
            @Override
            public void prtFile(String after, File file) {
                Boolean flag1;
                Boolean flag2;
                String read = IoRead.readCode( file );
                List<String> functions = DealStr.getFunctionList(read);
                HashMap<String, Boolean> map = new HashMap<>();
                for (String f : functions) {
                    flag1 =read.replace(f+"(","").length()+f.length()+1!=read.length();
                    flag2 =read.replace("\""+f+"\"","").length()!=read.length();
                    map.put(f,flag1||flag2);
                }
                String path ="C:\\Users\\22177\\Desktop\\io流\\无用方法.txt";
                for (Map.Entry<String, Boolean> function : map.entrySet()) {
                    if (!function.getValue()){
                        IoWrite.log(after+"/"+file.getName()+"中的"+function.getKey()+"没有被引用",path);
                    }

                }
            }
        }, "D:\\JAVA\\wokerspace\\bklianxi\\blog-api\\blog-app\\src\\views", "");
    }

4.结束

完事啦!!