leisure

          JAVA - exceed,helloworld
          隨筆 - 50, 文章 - 0, 評(píng)論 - 11, 引用 - 0
          數(shù)據(jù)加載中……

          淺淡Java代理模式之秘書MM

          代理對象一般定義了一個(gè)與目標(biāo)對象相似或相近的行為。代理對象負(fù)責(zé)對真實(shí)模塊調(diào)用,這使得調(diào)用者與被調(diào)用者之間建立了一個(gè)隔離帶。
          場景示例說明:老總說話都是很精簡,每次發(fā)布一個(gè)消息時(shí),總是先將簡要內(nèi)容交給秘書MM,秘書MM經(jīng)過一番美化后,把消息公布出來。

          設(shè)老總=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("我請大家吃飯。");

          結(jié)果出來的是:
          boss: 大家請注意了!我請大家吃飯。

          通過上面發(fā)現(xiàn),這種代理比較呆板,比如說,Boss口渴了,又得重新寫一個(gè)代理方法,這個(gè)時(shí)候,可以使用動(dòng)態(tài)代理來進(jìn)行:

          添加一個(gè)接口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 }

          這時(shí)秘書MM變?yōu)?/div>
           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想喝水了,于是 把水倒進(jìn)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想喝水了,于是 把水倒進(jìn)boss的杯子里。
          boss: 拿起杯子,喝水

          現(xiàn)在發(fā)現(xiàn)了吧,秘書MM真是服務(wù)周到呀。

          posted on 2011-12-09 09:54 leisure 閱讀(264) 評(píng)論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 观塘区| 彩票| 肃南| 绥滨县| 琼结县| 新丰县| 扬州市| 灵山县| 康马县| 麻江县| 张掖市| 双江| 浦东新区| 莫力| 阿拉善盟| 浠水县| 江油市| 来凤县| 始兴县| 平和县| 大洼县| 常宁市| 陵川县| 宽甸| 赤壁市| 石柱| 册亨县| 民县| 磴口县| 玉溪市| 永安市| 香格里拉县| 双流县| 和顺县| 罗田县| 北辰区| 海盐县| 黔江区| 乡宁县| 馆陶县| 郎溪县|