设计模式--代理模式

来源:互联网 发布:外国人来中国知乎 编辑:程序博客网 时间:2024/06/06 07:39

概念:为其他对象提供一种代理,以控制对这个对象的访问(火车票代售处)类似中介,去掉一些服务或者增加一些功能
AOP:再不改变原有类的一些方法的基础上,增加一些额外的业务逻辑
代理模式的几种
1.远程代理:为不同地理的对象提供局域网代表对象
2.虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建(加载今日头条时,文字先加载出来,图片过大而加载缓慢,会出现一个虚拟图片)
3.保护代理:控制用户的访问权限(只有注册了才能发帖,评论等)
4.智能引用代理:提供对目标对象额外服务

代理实现的两种方式:
静态代理:(使用聚合方式
代理和被代理对象在代理之前时确定的,他们都实现相同的接口或者都继承相同的抽象类
动态代理:动态产生代理,实现对不同类,不同方法的代理

使用动态代理,必须实现InvocationHandle接口
这里写图片描述
InvocationHandle是事务处理器


这里写图片描述


这里写图片描述


代码:

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * Created by lxq on 2017/9/4. */public class TimeHandle implements InvocationHandler{    private Object object;    public TimeHandle(Object object) {        super();        this.object = object;    }    /**     *     * @param proxy 被代理对象     * @param method 被代理对象的方法     * @param args 方法的参数     * @return     * @throws Throwable     */    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        /*        处理业务的逻辑         */        method.invoke(object);//传递过来的对象        /*        处理业务的逻辑         */        return null;    }}

测试代码:

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;/** * Created by lxq on 2017/9/4. */public class Test1 {    public static void main(String[] args){        // Car car = new Car();        Object object = new Object();        Class<?> cls = object.getClass();        InvocationHandler h = new TimeHandle(object);        /**         * @param loader 被代理类的类加载器         * @param interfaces 实现接口         * @param h InvocationHandle         */        //Moveable moveable = (Moveable)        Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),h);        //moveable.move();    }}

JDK动态代理和CGLIB代理的区别:
1.jdk动态代理只能代理实现了接口的类,没有实现接口的类不能实现JDK的动态代理
2.CGLIB是针对类来实现代理的:对制定目标类产生子类(通过继承方式final),通过对方法的重写