leisure

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

          淺淡Java代理模式之秘書MM

          代理對象一般定義了一個與目標對象相似或相近的行為。代理對象負責對真實模塊調(diào)用,這使得調(diào)用者與被調(diào)用者之間建立了一個隔離帶。
          場景示例說明:老總說話都是很精簡,每次發(fā)布一個消息時,總是先將簡要內(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口渴了,又得重新寫一個代理方法,這個時候,可以使用動態(tài)代理來進行:

          添加一個接口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變?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想喝水了,于是 把水倒進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: 拿起杯子,喝水

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

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

          主站蜘蛛池模板: 通城县| 尼玛县| 杭锦后旗| 灌云县| 巨鹿县| 龙山县| 略阳县| 静宁县| 泰州市| 肇源县| 舒城县| 逊克县| 常山县| 怀来县| 临猗县| 宜宾县| 嵊泗县| 岐山县| 夹江县| 江山市| 甘肃省| 万盛区| 宽城| 沁阳市| 曲阳县| 潜江市| 武宣县| 大丰市| 远安县| 临夏县| 新建县| 昭平县| 杂多县| 香港| 海安县| 星子县| 扬州市| 江源县| 报价| 襄城县| 瑞金市|