程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之義務鏈形式(Chain of Responsibility形式)引見

Java設計形式之義務鏈形式(Chain of Responsibility形式)引見

編輯:關於JAVA

Java設計形式之義務鏈形式(Chain of Responsibility形式)引見。本站提示廣大學習愛好者:(Java設計形式之義務鏈形式(Chain of Responsibility形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之義務鏈形式(Chain of Responsibility形式)引見正文


Chain of Responsibility界說:Chain of Responsibility(CoR) 是用一系列類(classes)試圖處置一個要求request,這些類之間是一個松懈的耦合,獨一配合點是在他們之間傳遞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();
}

詳細是一段完成接口Handler代碼:


public class ConcreteHandler implements Handler{
  private Handler successor;
  public ConcreteHandler(Handler successor){
          this.successor=successor;
        }

  public void handleHelp(){
    //詳細處置要求Help的代碼
    ...
  }

  public void handlePrint(){
    //假如是print 轉行止理Print
    successor.handlePrint();
  }
  public void handleFormat(){
    //假如是Format 轉行止理format
    successor.handleFormat();
  }

}

一共有三個如許的詳細完成類,下面是處置help,還有處置Print 處置Format這年夜概是我們最經常使用的編程思緒。

固然思緒簡略清楚明了,然則有一個擴大成績,假如我們須要再增長一個要求request品種,須要修正接口及其每個完成。

◆ 第二計劃:將每種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情形下,只是節儉了接口的修正量,接話柄現ConcreteHandler還須要修正。並且代碼明顯不簡略俏麗。


◆ 處理計劃3:在Handler接口中只應用一個參數化辦法:

public interface Handler{
  public void handleRequest(String request);
}
那末Handler完成代碼以下:

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);

    }
  }

}

這裡先假定request是String類型,假如不是怎樣辦?固然我們可以創立一個專門類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完成代碼以下:

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,在一個鏈上,都有響應職責的類,是以叫Chain of Responsibility。

1.CoR的長處:由於沒法預知來自外界的要求是屬於哪一種類型,每一個類假如碰著它不克不及處置的要求只需廢棄便可以。無疑這下降了類之間的耦合性。
2.CoR的缺陷是效力低,由於一個要求的完成能夠要遍歷到最初才能夠完成,固然也能夠用樹的概念優化。 在Java AWT1.0中,關於鼠標按鍵工作的處置就是應用CoR,到Java.1.1今後,就應用Observer取代CoR。

擴大性差,由於在CoR中,必定要有一個同一的接口Handler.局限性就在這裡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved