代理对象一般定义了一个与目标对象相似或相近的行为。代理对象负责对真实模块调用,这使得调用者与被调用者之间建立了一个隔离带。
场景示例说明:老总说话都是很精简,每次发布一个消息时,总是先将简要内容交给秘书MM,秘书MM经过一番美化后,把消息公布出来。
设老总=Boss,秘书MM=MMProxy
于是简单的代理就有
1 public class Boss {
2 public void anounce(String content) {
3 System.out.println(content);
4 }
5 }
1 public class MMProxy {
2 public void anounce(String content) {
3 System.out.print("boss: 大家请注意了!");
4 new Boss().anounce(content);
5 }
6 }
new MMProxy().anounce("我请大家吃饭。");
结果出来的是:
boss: 大家请注意了!我请大家吃饭。
通过上面发现,这种代理比较呆板,比如说,Boss口渴了,又得重新写一个代理方法,这个时候,可以使用动态代理来进行:
添加一个接口IBoss
1 public interface IBoss {
2 public void anounce(String content);
3 public void drink();
4 }
修改Boss
1 public class Boss implements IBoss {
2 public void anounce(String content) {
3 System.out.println(content);
4 }
5
6 public void drink() {
7 System.out.println("boss: 拿起杯子,喝水");
8 }
9 }
这时秘书MM变为
1 import java.lang.reflect.InvocationHandler;
2 import java.lang.reflect.Method;
3
4 public class MMProxy implements InvocationHandler {
5
6 private Object obj;
7
8 public MMProxy(Object obj) {
9 this.obj = obj;
10 }
11
12 public static Object newInstance(Object obj) {
13 return java.lang.reflect.Proxy.newProxyInstance(
14 obj.getClass().getClassLoader(),
15 obj.getClass().getInterfaces(),
16 new MMProxy(obj));
17 }
18
19 @Override
20 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
21 if("drink".equals(method.getName())) {
22 System.out.println("秘书MM: 看到boss想喝水了,于是 把水倒进boss的杯子里。");
23 } else if("anounce".equals(method.getName())) {
24 System.out.print("boss: 大家请注意!");
25 }
26 method.invoke(obj, args);
27 return null;
28 }
29 }
IBoss boss = (IBoss) MMProxy.newInstance(new Boss());
boss.anounce("我请大家吃饭。");
boss.drink();
boss: 大家请注意!我请大家吃饭。
秘书MM: 看到boss想喝水了,于是 把水倒进boss的杯子里。
boss: 拿起杯子,喝水
现在发现了吧,秘书MM真是服务周到呀。