国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

java設(shè)計模式之ChainofResponsibility

2019-11-18 15:48:49
字體:
供稿:網(wǎng)友

  Chain of Responsibility定義
  Chain of Responsibility(CoR) 是用一系列類(classes)試圖處理一個請求request,這些類之間是一個松散的耦合,唯一共同點(diǎn)是在他們之間傳遞request. 也就是說,來了一個請求,A類先處理,假如沒有處理,就傳遞到B類處理,
假如沒有處理,就傳遞到C類處理,就這樣象一個鏈條(chain)一樣傳遞下去。
  
  如何使用?
  雖然這一段是如何使用CoR,但是也是演示什么是CoR.
  
  有一個Handler接口:
  
  public interface Handler{
    public void handleRequest();
  }
  
  這是一個處理request的事例, 假如有多種request,比如 請求幫助 請求打印 或請求格式化:
  
  最先想到的解決方案是:在接口中增加多個請求:
  public interface Handler{
    public void handleHelp();
    public void handlePRint();
    public void handleFormat();
  
  }
  
  具體是一段實現(xiàn)接口Handler代碼:
  public class ConcreteHandler implements Handler{
    private Handler sUCcessor;
  
    public ConcreteHandler(Handler successor){
    this.successor=successor;
  }
  
    public void handleHelp(){
      //具體處理請求Help的代碼
      ...
    }
  
    public void handlePrint(){
      //假如是print 轉(zhuǎn)去處理Print
      successor.handlePrint();
    }
    public void handleFormat(){
      //假如是Format 轉(zhuǎn)去處理format
      successor.handleFormat();
    }
  
  }
  
  一共有三個這樣的具體實現(xiàn)類,上面是處理help,還有處理Print 處理Format這大概是我們最常用的編程思路。
  
  雖然思路簡單明了,但是有一個擴(kuò)展問題,假如我們需要再增加一個請求request種類,需要修改接口及其每一個實現(xiàn)。
  
  第二方案:將每種request都變成一個接口,因此我們有以下代碼 :
  
  public interface HelpHandler{
    public void handleHelp();
  }
  
  public interface PrintHandler{
    public void handlePrint();
  }
  
  public interface FormatHandler{
    public void handleFormat();
  }
  
  public class ConcreteHandler
    implements HelpHandler,PrintHandler,FormatHandlet{
    private HelpHandler helpSuccessor;
    private PrintHandler printSuccessor;
    private FormatHandler formatSuccessor;
  
    public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,FormatHandler formatSuccessor)
    {
      this.helpSuccessor=helpSuccessor;
      this.printSuccessor=printSuccessor;
      this.formatSuccessor=formatSuccessor;
    }
  
    public void handleHelp(){
      .......
    }
  
    public void handlePrint(){this.printSuccessor=printSuccessor;}
  
    public void handleFormat(){this.formatSuccessor=formatSuccessor;}
  
  }
  
  這個辦法在增加新的請求request情況下,只是節(jié)省了接口的修改量,接口實現(xiàn)ConcreteHandler還需要修改。而且代碼顯然不簡單漂亮。
  
  解決方案3: 在Handler接口中只使用一個參數(shù)化方法:
  public interface Handler{
    public void handleRequest(String request);
  }
  那么Handler實現(xiàn)代碼如下:
  public class ConcreteHandler implements Handler{
    private Handler successor;
  
    public ConcreteHandler(Handler successor){
      this.successor=successor;
    }
  
    public void handleRequest(String request){
      if (request.equals("Help")){
        //這里是處理Help的具體代碼
      }else
        //傳遞到下一個
        successor.handle(request);
  
      }
    }
  
  }
  
  這里先假設(shè)request是String類型,假如不是怎么辦?當(dāng)然我們可以創(chuàng)建一個專門類Request
  
  最后解決方案:接口Handler的代碼如下:
  public interface Handler{
    public void handleRequest(Request request);
  }
  Request類的定義:
  public class Request{
    private String type;
  
    public Request(String type){this.type=type;}
  
    public String getType(){return type;}
  
    public void execute(){
      //request真正具體行為代碼
    }
  }
  
  那么Handler實現(xiàn)代碼如下:
  public class ConcreteHandler implements Handler{
    private Handler successor;
  
    public ConcreteHandler(Handler successor){
      this.successor=successor;
    }
  
    public void handleRequest(Request request){
      if (request instanceof HelpRequest){
        //這里是處理Help的具體代碼
      }else if (request instanceof PrintRequst){
        request.execute();
      }else
        //傳遞到下一個
        successor.handle(request);
  
      }
    }
  
  }
  
  這個解決方案就是CoR, 在一個鏈上,都有相應(yīng)職責(zé)的類,因此叫Chain of Responsibility.
  
  CoR的優(yōu)點(diǎn):
  因為無法預(yù)知來自外界的請求是屬于哪種類型,每個類假如碰到它不能處理的請求只要放棄就可以。無疑這降低了類之間的耦合性。
  
  缺點(diǎn)是效率低,因為一個請求的完成可能要遍歷到最后才可能完成,當(dāng)然也可以用樹的概念優(yōu)化。 在java AWT1.0中,對于鼠標(biāo)按鍵事情的處理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR
  
  擴(kuò)展性差,因為在CoR中,一定要有一個統(tǒng)一的接口Handler.局限性就在這里。進(jìn)入討論組討論。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 峨边| 老河口市| 曲水县| 黄陵县| 高清| 舟山市| 樟树市| 乐山市| 巴青县| 庆城县| 武强县| 扎兰屯市| 微山县| 镇原县| 鸡东县| 额济纳旗| 玉山县| 乌兰察布市| 郧西县| 介休市| 保靖县| 唐山市| 桂阳县| 玉龙| 南平市| 拉孜县| 平陆县| 呼伦贝尔市| 广饶县| 和林格尔县| 安吉县| 普安县| 彰武县| 门源| 塔城市| 共和县| 北票市| 栾川县| 平安县| 沧州市| 阿鲁科尔沁旗|