定义
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
步骤
定义委托类subject
定义实现类realSubject
定义代理类proxy
客户端调用
demo
场景是完成一个UserManager的query调用
package proxy;
public class Main {
//定义委托类subject
interface UserManager {
void query();
}
//定义实现类realSubject 实现委托类
static class UserManagerImpl implements UserManager {
@Override
public void query() {
System.out.println("query");
}
}
//定义代理类proxy 实现委托类
static class UserManagerProxy implements UserManager {
UserManager userManager;
//引入实现类
UserManagerProxy(UserManager userManager) {
this.userManager = userManager;
}
@Override
public void query() {
//调用实现类的对应方法
userManager.query();
}
}
public static void main(String[] args) {
UserManagerProxy proxy = new UserManagerProxy(new UserManagerImpl());
proxy.query();
}
}
AOP的体现
现在假设需要知道query执行的前后时间,怎么办
直接在UserManagerProxy#query前后分别记录时间即可,和业务层,实现类UserManagerImpl 无关
体现出代理能够完成
预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理
静态代理的缺点
1.代码维护的复杂,冗余
因为实现类和代理类 都 实现了 委托类 这个接口,比如
UserManager 新增create()方法
那么UserManagerProxy 以及 UserManagerImpl 都需要新增create()方法
2.代理类只服务于一种类型的对象
比如说这里UserManagerProxy只服务于UserManager类型对象
之后如果有AManager,就得有AProxy,有BManager,就得有BProxy
那这样如果有n个委托类,那么就有n个代理类
refer
http://layznet.iteye.com/blog/1182924
http://blog.youkuaiyun.com/hejingyuan6/article/details/36203505
http://www.cnblogs.com/fingerboy/p/5335328.html
转摘于:https://www.jianshu.com/p/65571edd98a8