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 閱讀(264) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 凉城县| 达州市| 安多县| 元阳县| 夹江县| 海宁市| 泾源县| 甘孜县| 朝阳市| 中江县| 基隆市| 伊春市| 民权县| 高州市| 名山县| 青铜峡市| 巴林右旗| 贵阳市| 西安市| 神木县| 凤翔县| 比如县| 湖南省| 淄博市| 双辽市| 隆德县| 光山县| 集安市| 皋兰县| 定远县| 沁源县| 敦煌市| 梁平县| 太仆寺旗| 修文县| 营口市| 蒙阴县| 区。| 阿尔山市| 孟州市| 沾益县|