代理模式从字面的含义上来讲就是找一个中介作为代理,对某些方法或服务进行增强,降低代码的耦合性。主要有三种代理模式
一.静态代理:静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
1.先创建提供服务的接口,作为源头
package Proxy_design;
//提供服务本体
public interface SomeService {
String doFirst();
void doSecond();
}
2.实现服务接口,作为提供服务的本体
public class SomeServiceImpl implements SomeService {
@Override
public String doFirst() {
System.out.println("执行doFirst()方法");
return "abcde";
}
@Override
public void doSecond() {
System.out.println("执行doSecond()方法");
}
}
3.创建代理类,增强服务接口中的方法
public class SomeServiceProxy implements SomeService {
//创建代理目标对象
private SomeService target;
public SomeServiceProxy() {
target=new SomeServiceImpl();
}
@Override
public String doFirst() {
// 代理类调用目标方法
String result = target.doFirst();
// 对目标方法进行增强
return result.toUpperCase();
}
@Override
public void doSecond() {
target.doSecond();
}
}
4.创建一个测试类
public class MyTest {
public static void main(String[] args) {
SomeService someService = new SomeServiceProxy();
String result = someService.doFirst();
System.out.println("result=" + result);
someService.doSecond();
}
}
运行结果:
代理类主要实现了服务接口的方法,然后通过new一个被代理类的对象,对被代理类的方法进行增强,然后在调用的时候,new一个代理类的对象,即可以调用增强后的方法。下面的图是对这整个过程底层实现的描述。首先最先进入栈的是main方法,然后调用代理类中的doFirst方法,然后再进一步调用被代理类中的doFirst方法,然后被代理类返回abcde,出栈,这时候代理类对其进行增强,然后再出栈,然后就传递给main方法,这时候就是ABCDE。