Java責任鏈模式(ChainofResponsibility模式)
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。
-
CoR的優點:因為無法預知來自外界的請求是屬於哪種型別,每個類如果碰到它不能處理的請求只要放棄就可以。無疑這降低了類之間的耦合性。
-
CoR的缺點是效率低,因為一個請求的完成可能要遍歷到最後才可能完成,當然也可以用樹的概念優化。 在Java AWT1.0中,對於滑鼠按鍵事情的處理就是使用CoR,到Java.1.1以後,就使用Observer代替CoR。 擴充套件性差,因為在CoR中,一定要有一個統一的介面Handler.侷限性就在這裡。
原文釋出時間為:2018-08-30
本文作者:HARRIES
本文來自雲棲社群合作伙伴“Java雜記”,瞭解相關資訊可以關注“Java雜記”。
相關文章
- JAVA設計模式之責任鏈模式Java設計模式
- 責任鏈模式模式
- Java學設計模式之責任鏈模式Java設計模式
- 我的Java設計模式-責任鏈模式Java設計模式
- 設計模式 —— 責任鏈模式設計模式
- 設計模式(責任鏈模式)設計模式
- 設計模式-責任鏈模式設計模式
- 責任鏈模式妙用模式
- 「責任鏈模式」栗子模式
- 責任鏈模式探究模式
- 設計模式(三) 責任鏈模式設計模式
- 設計模式之責任鏈模式設計模式
- 設計模式之——責任鏈模式設計模式
- 設計模式之責任鏈模式——Java語言描述設計模式Java
- 5、php責任鏈模式PHP模式
- 23_責任鏈模式模式
- PHP-責任鏈模式PHP模式
- 這就是『責任鏈模式』?模式
- 責任鏈模式(Chain Of Responsibility)模式AI
- 設計模式系列之「責任鏈模式」設計模式
- PHP 設計模式之責任鏈模式PHP設計模式
- 極簡設計模式-責任鏈模式設計模式
- Java進階篇設計模式之八 ----- 責任鏈模式和命令模式Java設計模式
- Design Patterns in Android:責任鏈模式Android模式
- Netty中的責任鏈模式Netty模式
- Chain of responsibility-責任鏈模式AI模式
- 責任鏈模式(案例解析)(9)模式
- 責任鏈模式的實踐模式
- 聊一聊責任鏈模式模式
- 設計模式(四)OkHttp的責任鏈模式設計模式HTTP
- 設計模式第七講-責任鏈模式設計模式
- 代理模式增強之路(代理+責任鏈模式)模式
- 設計模式 | 責任鏈模式及典型應用設計模式
- Rust語言之GoF設計模式:責任鏈模式RustGo設計模式
- 用Lambda重構責任模式鏈模式
- 每天一個設計模式之責任鏈模式設計模式
- Go 實現常用設計模式(十)責任鏈模式Go設計模式
- 設計模式:如何優雅地使用責任鏈模式設計模式