2、静态代理

定义

由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

步骤

定义委托类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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值