浅淡Java代理模式之秘书MM

浅淡Java代理模式之秘书MM

代理对象一般定义了一个与目标对象相似或相近的行为。代理对象负责对真实模块调用,这使得调用者与被调用者之间建立了一个隔离带。
场景示例说明:老总说话都是很精简,每次发布一个消息时,总是先将简要内容交给秘书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真是服务周到呀。

你可能感兴趣的:(浅淡Java代理模式之秘书MM)