代理模式之静态代理
代理模式之静态代理
1.代理模式的概念
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
个人理解:就是在一些方法实现中一些功能比如带日志的实现类,需要在类中实现日志输出的代码。它对核心业务功能有干扰,分散在各个业务功能方法中,不利于统一的封装和维护。 使用代理模式通过代理类来实现这些分散的方法并调用目标方法
在使用代理模式后:
以下为具体的代码实现:
这里以实现四种基本计算方法为例,通过代理类将日志输出与核心代码方法实现返回
package com.qcw.spring.proxy;
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);
}
package com.qcw.spring.proxy;
public class CalculatorImpl implements Calculator{
public int add(int i, int j) {
int result = i + j;
System.out.println("方法内部,result"+ result);
return result;
}
public int sub(int i, int j) {
int result = i - j;
System.out.println("方法内部,result"+ result);
return result;
}
public int mul(int i, int j) {
int result = i * j;
System.out.println("方法内部,result"+ result);
return result;
}
public int div(int i, int j) {
int result = i / j;
System.out.println("方法内部,result"+ result);
return result;
}
}
package com.qcw.spring.proxy;
public class CalculatorStaticProxy implements Calculator {
private CalculatorImpl target;
//创建有参构造能够在类中调用方法
public CalculatorStaticProxy(CalculatorImpl target) {
this.target = target;
}
public int add(int i, int j) {
System.out.println("日志,方法:add,参数:"+i+","+j);
int result = target.add(i, j);
System.out.println("日志,方法:add,结果:"+result);
return result;
}
public int sub(int i, int j) {
System.out.println("日志,方法:sub,参数:"+i+","+j);
int result = target.sub(i, j);
System.out.println("日志,方法:sub,结果:"+result);
return result;
}
public int mul(int i, int j) {
System.out.println("日志,方法:mul,参数:"+i+","+j);
int result = target.mul(i, j);
System.out.println("日志,方法:mul,结果:"+result);
return result;
}
public int div(int i, int j) {
System.out.println("日志,方法:div,参数:"+i+","+j);
int result = target.div(i, j);
System.out.println("日志,方法:div,结果:"+result);
return result;
}
}
package com.qcw.spring.test;
import com.qcw.spring.proxy.CalculatorImpl;
import com.qcw.spring.proxy.CalculatorStaticProxy;
import org.junit.Test;
public class CalculatorTest {
@Test
public void testCalculator(){
CalculatorStaticProxy proxy = new CalculatorStaticProxy(new CalculatorImpl());
proxy.add(1,2);
}
}
还没有评论,来说两句吧...