首页 > 编程语言 > 详细

java代理设计模式

时间:2021-01-09 23:29:05      阅读:40      评论:0      收藏:0      [点我收藏+]
看了一篇关于Mybatis的底层原理JDK动态代理,又忍不住重温了一次代理设计模式

一、代理设计模式是什么?

简单的来说,设计模式就是前辈为了解决一些特定的问题而总结出来的一种实现方式

代理设计模式三大对象

1:真实对象
2:代理对象
3:抽象对象

使用代理设计模式的优点

1:保护你的真实对象
2:让真实对象的职责更明确
3:方便你的代码进行扩展

代理设计模式的三种实现方式

1:静态代理实现
2:JDK动态实现
3:CGlib动态实现
其中两种动态的实现方法才是需要真正去理解的

二、具体的三种实现方式

1.静态代理实现

定义一个抽象接口类()
代码如下(示例):

public interface a{
void eat();
}
//定义一个真实对象类实现抽象类方法

public class b implements a{
    @Override
    public void eat() {
        System.out.println("吃");
    }
}

//定义一个代理对象实现抽象接口类的方法

public class c implements a{
    b  zhenShi=new b();
    @Override
    public void chifan() {
        //调用真实对象前执行的操作
        System.out.println("。。。");
        //2.调用真实对象的功能
        zhenShi.eat();
        //3.调用真实对象后执行的操作
        System.out.println("....");
    }
}

形象一点就是把代理对象当成为一个中间人,比方说一个人要租房,代理对象就是中介,真实对象就是房东,抽象对象就是你,你的功能就是租房,房东就是只负责租房给你功能,其余的剩下的比方看房什么的就全部交由中介来做。目的就是为了让真实对象的功能更加明确。

2.jdk动态代理

代码如下(示例):

//抽象功能

public interface a{
    void eat();
}

//真实对象

public class b implements a{
    @Override
    public void eat() {
        System.out.println("吃");
    }
}

// 生成代理对象的处理器
// 生成代理对象,调用对应invoke方法
//编写jdk动态代理控制器类实现InvocationHandler接口

public class JdkProxyHandler implements InvocationHandler{
    b bb=new b();
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("...");
        //真实对象的方法
        Object obj=method.invoke(bb, args);
        System.out.println("...");
        return obj;
    }
}

jdk动态代理是基于java的反射机制实现的,运行效率基于Cglib来说较低,还是不推荐使用jdk来实现

3.Cglib动态代理

代码如下(示例):

//真实目标对象

public class b{
    public void eat() {
        System.out.println("吃");
    }
}

//cglib动态代理的控制器

@author meimei

public class CglibProxyHandler implements MethodInterceptor{
    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("...");
        Object obj=arg3.invokeSuper(arg0, arg2);
        System.out.println("....");
        return obj;
    }
}

//测试类

public class Test {
    public static void main(String[] args) {
        //生成代理对象  是真实对象的子类
        Enhancer  enhancer=new Enhancer();
        //设置目标对象,父类
        enhancer.setSuperclass(b.class);
        //设置调用动态代理控制器
        enhancer.setCallback(new CglibProxyHandler());
        b bb=(b)enhancer.create();
        bb.eat();
    }
}

![](https://s4.51cto.com/images/blog/202101/08/b4c0f19610461265699c4c8305ae2631.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
**用cglib时需要导入这个jar包**

目标对象不需要实现接口,生成的代理对象是真实对象的子类。
基于字节码实现,运行效率相对于jdk要高。

java代理设计模式

原文:https://blog.51cto.com/15079488/2585796

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!