Lecture09-切面-提出问题

文章目录

    [toc]

    Lecture09-切面-提出问题

    1、声明接口

    public interface Calculator {
        
        int add(int i, int j);
        
        int sub(int i, int j);
        
        int mul(int i, int j);
        
        int div(int i, int j);
        
    }
    

    2、给接口声明一个纯净版实现

    img001

    没有额外功能

    package com.atguigu.proxy.impl;
        
    import com.atguigu.proxy.api.Calculator;
        
    public class CalculatorPureImpl implements Calculator {
        
        @Override
        public int add(int i, int j) {
        
            int result = i + j;
        
            System.out.println("方法内部 result = " + result);
        
            return result;
        }
        
        @Override
        public int sub(int i, int j) {
        
            int result = i - j;
        
            System.out.println("方法内部 result = " + result);
        
            return result;
        }
        
        @Override
        public int mul(int i, int j) {
        
            int result = i * j;
        
            System.out.println("方法内部 result = " + result);
        
            return result;
        }
        
        @Override
        public int div(int i, int j) {
        
            int result = i / j;
        
            System.out.println("方法内部 result = " + result);
        
            return result;
        }
    }
    

    3、再声明一个带日志功能的实现

    img002

    package com.atguigu.proxy.impl;
    
    import com.atguigu.proxy.api.Calculator;
    
    public class CalculatorLogImpl implements Calculator {
        
        @Override
        public int add(int i, int j) {
        
            System.out.println("[日志] add 方法开始了,参数是:" + i + "," + j);
        
            int result = i + j;
        
            System.out.println("方法内部 result = " + result);
        
            System.out.println("[日志] add 方法结束了,结果是:" + result);
        
            return result;
        }
        
        @Override
        public int sub(int i, int j) {
        
            System.out.println("[日志] sub 方法开始了,参数是:" + i + "," + j);
        
            int result = i - j;
        
            System.out.println("方法内部 result = " + result);
        
            System.out.println("[日志] sub 方法结束了,结果是:" + result);
        
            return result;
        }
        
        @Override
        public int mul(int i, int j) {
        
            System.out.println("[日志] mul 方法开始了,参数是:" + i + "," + j);
        
            int result = i * j;
        
            System.out.println("方法内部 result = " + result);
        
            System.out.println("[日志] mul 方法结束了,结果是:" + result);
        
            return result;
        }
        
        @Override
        public int div(int i, int j) {
        
            System.out.println("[日志] div 方法开始了,参数是:" + i + "," + j);
        
            int result = i / j;
        
            System.out.println("方法内部 result = " + result);
        
            System.out.println("[日志] div 方法结束了,结果是:" + result);
        
            return result;
        }
    }
    

    4、提出问题

    ①现有代码缺陷

    针对带日志功能的实现类,我们发现有如下缺陷:

    • 对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力
    • 附加功能分散在各个业务功能方法中,不利于统一维护

    ②解决思路

    解决这两个问题,核心就是:解耦。我们需要把附加功能从业务功能代码中抽取出来。


    ③困难

    解决问题的困难:要抽取的代码在方法内部,靠以前把子类中的重复代码抽取到父类的方式没法解决。所以需要引入新的技术。

    end