欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 设计模式-动态代理模式

设计模式-动态代理模式

2024/10/24 16:30:08 来源:https://blog.csdn.net/Z_DOUBLE_Y/article/details/141032351  浏览:    关键词:设计模式-动态代理模式

目录

 什么是代理模式?

  为什么要用代理模式?

   有哪几种代理模式?

动态代理(jdk自带):

动态代理(第三方库-cglib):



 什么是代理模式?

       代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。 


  为什么要用代理模式?

        中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,
而代理类对象可以在客户类和委托对象之间起到中介的作用,其 特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:
        代理类除了是客户类和委托类的中介之外,我们还可以通过给代理 类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。


   有哪几种代理模式?

            我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:
 静态代理:
       静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
 动态代理:
       动态代理是在程序运行时通过反射机制动态创建的。
  动态代理分为:
         基于接口的动态代理(jdk自带)
        基于子类的动态代理(第三方)

动态代理(jdk自带):

        代码示例:

//接口类
public interface ISinger {public void singer();public int dance(int n);
}//实现类
public class Xiaomei implements ISinger{@Overridepublic void singer() {System.out.println("=====唱一首狼的诱惑=====");}@Overridepublic int dance(int n) {System.out.println("=====跳一个昆卡=====");return 0;}
}//静态代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class Test01 {public static void main(String[] args) {ISinger singer=new Xiaomei();//jdk动态代理(类加载器,动态字节数组,处理代理实例方法调用)ISinger Jingjiren=(ISinger) Proxy.newProxyInstance(singer.getClass().getClassLoader(), singer.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("做个自我介绍");Object obj=method.invoke(singer,args);return obj;}});Jingjiren.singer();Jingjiren.dance(6);}
}

运行结果:

动态代理(第三方库-cglib):

        代码示例:

public interface ISinger {public void singer();}public class ZhouJieLun implements ISinger{@Overridepublic void singer() {System.out.println("----一首反方向的钟送给大家----");}
}import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;public class Test02 {public static void main(String[] args) {ISinger singer=new ZhouJieLun();//第三方库的动态代理ISinger Jingjiren=(ISinger) Enhancer.create(singer.getClass(), singer.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {System.out.println("-------自我介绍-------");Object obj=method.invoke(singer,objects);return obj;}});Jingjiren.singer();}
}

运行结果:

静态代理(代码示例):

//当西门庆想找潘金莲,但是他不能直接找,那么需要找个中间代理,
当西门庆调中间代理时便调到了潘金莲//接口
public interface IWomen {public void makeEyeWithMan();
}public class PanjinglianImpl implements IWomen{@Overridepublic void makeEyeWithMan() {System.out.println("回眸一笑,抛个媚眼~");}
}public class WangPoImpl implements IWomen{//被代理对象IWomen woman;public WangPoImpl(IWomen woman) {this.woman = woman;}@Overridepublic void makeEyeWithMan() {System.out.println("镇一壶酒,搞搞气氛~");woman.makeEyeWithMan();}
}public class XiMenQing {public static void main(String[] args) {//创建被代理对象PanjinglianImpl panjinglian=new PanjinglianImpl();//创建代理WangPoImpl wangPo=new WangPoImpl(panjinglian);wangPo.makeEyeWithMan();}
}

运行结果:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com