夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          <2011年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          公告

          本博客中未注原創(chuàng)的文章均為轉(zhuǎn)載,對轉(zhuǎn)載內(nèi)容可能做了些修改和增加圖片注釋,如果侵犯了您的版權(quán),或沒有注明原作者,請諒解

          常用鏈接

          留言簿(21)

          隨筆分類(644)

          隨筆檔案(669)

          文章檔案(6)

          最新隨筆

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          責(zé)任鏈模式
              在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使系統(tǒng)可以在不影響客戶端的情況下動態(tài)的重新組織鏈和分配責(zé)任。
          責(zé)任鏈模式的組成部份
              1.抽象處理者 定義出一個處理請求的接口。如果需要,接口可以定義出一個方法,以設(shè)定和返回下家的引用。這個角色通常由一個Java抽象類或Java接口實現(xiàn)。
              2.具體處理 具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于處理者持有下家引用,因此,如果需要,具體處理者可以訪問下家。
          責(zé)任鏈模式組成部份之間的關(guān)系

          一個例子:
          1.抽象處理者
          package responsibility;

          public abstract class Handler
          {
              
          protected Handler nextHandler;
              
              
          public abstract void handleRequest(String name);
              
              
          public void setNextHandler(Handler handler)
              
          {
                  
          this.nextHandler = handler;
              }

          }

          2.寶玉
          package responsibility;

          /**
           * <ul>
           * <li>Title:[JiaBaoYu]</li>
           * <li>Description: [賈寶玉]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-31]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class JiaBaoYu extends Handler
          {
              
          public void handleRequest(String name)
              
          {
                  
          if("賈寶玉".equals(name))
                  
          {
                      System.out.println(
          "賈寶玉表演節(jié)目");
                  }

                  
          else
                  
          {
                      System.out.println(
          "賈寶玉傳把花遞給下一位");
                      
          if (nextHandler != null)
                      
          {
                          
          this.nextHandler.handleRequest(name);
                      }

                  }

              }

          }

          林黛玉:
          package responsibility;

          /**
           * <ul>
           * <li>Title:[LinDaiYu]</li>
           * <li>Description: [林戴玉]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-31]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class LinDaiYu  extends Handler
          {   
              
          public void handleRequest(String name)
              
          {
                  
          if("林戴玉".equals(name))
                  
          {
                      System.out.println(
          "林戴玉表演節(jié)目");
                  }

                  
          else
                  
          {
                      System.out.println(
          "林戴玉把花傳遞給下一位");
                      
          if (nextHandler != null)
                      
          {
                          
          this.nextHandler.handleRequest(name);
                      }

                  }

              }

          }

          探春:
          package responsibility;

          /**
           * <ul>
           * <li>Title:[TanChun]</li>
           * <li>Description: [探春]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-31]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
           * 
          @version 1.0
           
          */

          public class TanChun extends Handler
          {
              
          public void handleRequest(String name)
              
          {
                  
          if ("探春".equals(name))
                  
          {
                      System.out.println(
          "探春表演節(jié)目");
                  }

                  
          else
                  
          {
                      System.out.println(
          "探春把花傳遞給下一位");
                      
          if (nextHandler != null)
                      
          {
                          nextHandler.handleRequest(name);
                      }

                  }

              }

          }

          襲人:
          package responsibility;

          /**
           * <ul>
           * <li>Title:[XiRen]</li>
           * <li>Description: [襲人]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-7-31]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class XiRen extends Handler
          {   
              
          public void handleRequest(String name)
              
          {
                  
          if("襲人".equals(name))
                  
          {
                      System.out.println(
          "襲人表演節(jié)目");
                  }

                  
          else
                  
          {
                      System.out.println(
          "襲人把花傳遞給下一位");
                      
          if (nextHandler != null)
                      
          {
                          
          this.nextHandler.handleRequest(name);
                      }

                  }

              }

          }



          環(huán)境:
          package responsibility;

          public class Client
          {
              
          public static void main(String[] args)
              
          {
                  
          // 賈寶玉
                  Handler jiabaoyu = new JiaBaoYu();
                  
          // 林黛玉
                  Handler lindaiyu = new LinDaiYu();
                  
          // 襲人
                  Handler xiren = new XiRen();
                  
          // 探春
                  Handler tanchun = new TanChun();
                  
                  jiabaoyu.setNextHandler(lindaiyu);
                  lindaiyu.setNextHandler(xiren);
                  xiren.setNextHandler(tanchun);
                  
                  jiabaoyu.handleRequest(
          "賈寶玉");
              }

          }



          純的與不純的責(zé)任鏈
          在一個純的責(zé)任鏈模式里面,一個請求必須被某一個處理者對象所接收;在一個不純的責(zé)任鏈模式里面,一個請求可以最終不被任何接收端對象所接收。

          責(zé)任鏈模式的優(yōu)點

                 責(zé)任鏈模式非常顯著的優(yōu)點是請求和處理分開。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌(例如在J2EE項目開發(fā)中,可以剝離出無狀態(tài)Bean由責(zé)任鏈處理),兩者解耦,提高系統(tǒng)的靈活性。

          責(zé)任鏈模式的缺點

                 責(zé)任鏈有兩個非常顯著的缺點:一是性能問題,每個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個非常大的問題。二是調(diào)試不是很方便,特別是鏈條比較長,環(huán)節(jié)比較多的時候,由于采用了類似遞歸的方式,調(diào)試的時候邏輯可能比較復(fù)雜。



          posted on 2011-08-01 00:04 HUIKK 閱讀(373) 評論(0)  編輯  收藏 所屬分類: Design Patterns
          主站蜘蛛池模板: 彰化市| 新竹市| 镇原县| 丰都县| 西平县| 呼玛县| 封开县| 固安县| 分宜县| 莱阳市| 平武县| 延安市| 昌吉市| 沛县| 兰西县| 泰州市| 肇源县| 繁昌县| 铜陵市| 昌图县| 外汇| 蒲城县| 镇平县| 永康市| 峨边| 从化市| 阿拉善右旗| 巴林左旗| 贵州省| 七台河市| 盈江县| 定陶县| 台中市| 平和县| 巧家县| 敖汉旗| 如东县| 广昌县| 永安市| 德州市| 岳阳市|