国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 枝江市| 平江县| 常德市| 棋牌| 中超| 顺昌县| 无棣县| 西城区| 门源| 中阳县| 太仓市| 乐清市| 绥棱县| 沧源| 博爱县| 正镶白旗| 汉川市| 西乌| 武陟县| 封开县| 西乌珠穆沁旗| 龙门县| 会昌县| 巴青县| 中超| 延川县| 星座| 安多县| 民权县| 江口县| 赤峰市| 定安县| 深泽县| 太康县| 宜君县| 亳州市| 淮滨县| 柯坪县| 鄂伦春自治旗| 万盛区| 达日县|