●问题
○代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀。每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点。
○代码分散: 以日志需求为例,只是为了满足这个单一需求,就不得不在多个模块(方法)里多次重复相同的日志代码。如果日志需求发生变化,必须修改所有模块。
- 动态代理
代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
package com.aop.proxy;
public interface MathCaculate {
int add(int i,int j);
int sub(int i,int j);
int mul(int i,int j);
int div(int i,int j);
}
package com.aop.proxy;
public class success implements MathCaculate {
@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;
}
}
package com.aop.proxy;
public class Log implements MathCaculate{
@Override
public int add(int i, int j) {
System.out.println("[日志][方法名:add][方法开始][参数:"+i+","+j+"]");
int result = i + j;
System.out.println("[日志][方法名:add][方法结束][参数:"+result+"]");
return result;
}
@Override
public int sub(int i, int j) {
System.out.println("[日志][方法名:add][方法开始][参数:"+i+","+j+"]");
int result = i - j;
System.out.println("[日志][方法名:add][方法结束][参数:"+result+"]");
return result;
}
@Override
public int mul(int i, int j) {
System.out.println("[日志][方法名:add][方法开始][参数:"+i+","+j+"]");
int result = i * j;
System.out.println("[日志][方法名:add][方法结束][参数:"+result+"]");
return result;
}
@Override
public int div(int i, int j) {
System.out.println("[日志][方法名:add][方法开始][参数:"+i+","+j+"]");
int result = i / j;
System.out.println("[日志][方法名:add][方法结束][参数:"+result+"]");
return result;
}
}
package com.aop.proxy;
public class MathCaculateTest {
public static void main(String[] args) {
//MathCaculate caculator = new success();
MathCaculate caculator = new Log();
caculator.add(5, 5);
System.out.println();
caculator.sub(5, 5);
System.out.println();
caculator.mul(5, 5);
System.out.println();
caculator.div(5, 5);
System.out.println();
}
}