[[toc]]

第一节 情景设定

1、声明接口

public interface Calculator {

  1. int add(int i, int j);
  2. int sub(int i, int j);
  3. int mul(int i, int j);
  4. int div(int i, int j);

}

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

01.情景设定 - 图1

没有额外功能
package com.atguigu.proxy.imp;

import com.atguigu.proxy.api.Calculator;

public class CalculatorPureImpl implements Calculator {

@Override<br />    public int add(int i, int j) {

    int result = i + j;

    System.out.println("方法内部 result = " + result);

    return result;<br />    }

@Override<br />    public int sub(int i, int j) {

    int result = i - j;

    System.out.println("方法内部 result = " + result);

    return result;<br />    }

@Override<br />    public int mul(int i, int j) {

    int result = i * j;

    System.out.println("方法内部 result = " + result);

    return result;<br />    }

@Override<br />    public int div(int i, int j) {

    int result = i / j;

    System.out.println("方法内部 result = " + result);

    return result;<br />    }<br />}

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

01.情景设定 - 图2

package com.atguigu.proxy.imp;

import com.atguigu.proxy.api.Calculator;

public class CalculatorLogImpl implements Calculator {

@Override<br />    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;<br />    }

@Override<br />    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;<br />    }

@Override<br />    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;<br />    }

@Override<br />    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;<br />    }<br />}

4、提出问题

①现有代码缺陷

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

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

②解决思路

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

③困难

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

回目录 下一节