leisure

          JAVA - exceed,helloworld
          隨筆 - 50, 文章 - 0, 評論 - 11, 引用 - 0
          數據加載中……

          淺淡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真是服務周到呀。

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

          主站蜘蛛池模板: 丹巴县| 岳阳市| 临江市| 徐水县| 玉林市| 金昌市| 岢岚县| 吴桥县| 万年县| 泸州市| 察雅县| 德州市| 江源县| 陆良县| 宝兴县| 嫩江县| 比如县| 鹰潭市| 卓尼县| 渝北区| 苏州市| 嘉峪关市| 金湖县| 永寿县| 嵊州市| 秦皇岛市| 陆川县| 安多县| 永清县| 台安县| 岳阳市| 龙门县| 蒙自县| 东兰县| 若羌县| 马龙县| 延川县| 临澧县| 兰考县| 高淳县| 碌曲县|