Loading... ## 介绍: ### 代理设计模式的原理: * 代理模式是使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 * 静态代理,特征是代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。最好可以通过一个代理类完成全部的代理功能。 * 动态代理,是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。 ### 动态代理使用场合: 调试、远程方法调用 ### 动态代理相比于静态代理的优点 抽象角色中(接口)声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样,我们可以更加灵活和统一的处理众多的方法。 ## 静态代理: ```java /** * @author 本当迷 * @Description * @date 2022/7/3-16:11 */ /** * 静态代理举例 * * 特点:代理类和被代理类在编译期间,就确定下来了。 */ interface ClothFactory{ void produceCloth(); } // 代理类 class PersonTest implements ClothFactory{ private final ClothFactory factory; // 用被代理类进行实例化 public PersonTest(ClothFactory clothFactory){ this.factory = clothFactory; } @Override public void produceCloth() { System.out.println("电脑开始准备工作!"); factory.produceCloth(); System.out.println("电脑结束工作!"); } } // 被代理类 class NeckTest implements ClothFactory{ @Override public void produceCloth() { System.out.println("正在植入病毒!"); } } public class 静态代理工厂 { public static void main(String[] args) { final NeckTest neckTest = new NeckTest(); final PersonTest personTest = new PersonTest(neckTest); personTest.produceCloth(); } } ``` ## 动态代理: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.security.PrivateKey; /** * @author 本当迷 * @Description * @date 2022/7/3-16:20 */ interface Moon{ String getBelief(); void showInfo(String Moon); } // 被代理类 class Venus implements Moon{ @Override public String getBelief() { return "调用空参方法!"; } @Override public void showInfo(String moon) { System.out.println("调用带参方法,参数为:" + moon); } } class DeskTest implements InvocationHandler{ private Object object; public void bind(Object object){ this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // method:代理类对象调用的方法,此方法也就作为被代理类对象要调用的方法 // obj:被代理类对象 final Object returnValue = method.invoke(object, args); //上述方法的返回值就作为当前类中的invoke()的返回值。 return returnValue; } } class BookTest{ // obj被代理类对象 public static Object getProxyInstance(Object obj){ final DeskTest deskTest = new DeskTest(); deskTest.bind(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), deskTest); } } public class 动态代理工厂 { public static void main(String[] args) { final Venus venus = new Venus(); final Moon proxyInstance = (Moon) BookTest.getProxyInstance(venus); final String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.showInfo("我爱JAVA!"); System.out.println("*********************"); final NeckTest neckTest = new NeckTest(); ClothFactory factory = (ClothFactory) BookTest.getProxyInstance(neckTest); factory.produceCloth(); } } ``` 最后修改:2022 年 07 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 如果文章有用,请随意打赏。