1 package com.cnblogs.vincentzh.dynamicproxy; 2 // 创建房主类(真实角色),实现租房接口 3 public class HouseHolder implements Rent 4 { 5 @Override 6 public void rent() 7 { 8 System.out.println("HouseHolder: I’m renting the house!"); 9 } 10 }
1 package com.cnblogs.vincentzh.dynamicproxy; 2 // 创建商人类(真实对象),实现售卖接口 3 public class BusinessMan implements Sale 4 { 5 @Override 6 public void sale() 7 { 8 System.out.println("BusinessMan: I'm salling something!"); 9 } 10 }
3)创建动态代理类,只需要一个代理类,就能够实现对 n 个需代理对象的代理,从而解决了静态代理中代理与真实对象一一对应导致类的数目急剧增加的问题。
1 package com.cnblogs.vincentzh.dynamicproxy; 2 // 创建动态代理类,实现代码运行过程中对各种真实对象的动态代理 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class DynamicProxy implements InvocationHandler 7 { 8 private Object realSubject; 9 10 public DynamicProxy(Object realSubject) 11 { 12 this.realSubject = realSubject; 13 } 14 15 public void setRealSubject(Object realSubject) 16 { 17 this.realSubject = realSubject; 18 } 19 20 21 @Override 22 // 实现InvocationHandler接口的 invoke 方法,当代理类调用真实对象的方法时, 23 // 将直接寻找执行 invoke 方法。 24 public Object invoke(Object proxy, Method method, Object[] args) 25 throws Throwable 26 { 27 this.preRent(); // 执行代理自己添加的行为操作 28 29 method.invoke(realSubject, args); // 以反射(reflection)的形式引用真实对象的方法 30 31 this.postRent(); // 执行代理自己添加的行为操作 32 return null; 33 } 34 35 // 代理类自行添加的行为 36 public void preRent() 37 { 38 System.out.println("I need more money!"); 39 } 40 41 // 代理类自行添加的行为 42 public void postRent() 43 { 44 System.out.println("I will deduct some money!"); 45 } 46 }
4)客户调用类,只需通过改变被代理的真实对象,就能直接实现被代理的对象的更换,就不需要再去为 BusinessMan 类创建一个新的代理类了。BusinessMan类和HouseHolder类公用一个DynamicProxy动态代理类,但在做代理时,却是动态生成两个不同的代理实例(Proxy Instance),这就是所谓的动态代理。