責任鏈模式(Chain Of Responsibility)
目的
它屬於 行為設計模式目錄。透過為多個物件提供處理請求的機會,避免將請求的傳送者與其接收者耦合。連結接收物件並沿鏈傳遞請求,直到物件處理它。
說明
國王向他的軍隊發出了命令。最早做出反應的是指揮官,然後是軍官,最後是士兵。這裡的指揮官,軍官和士兵構成了一系列責任。簡單來說
它有助於構建一系列物件。請求從一端進入並從一個物件到另一個物件,直到找到合適的處理程式。
維基百科說
在物件導向的設計中,責任鏈模式是一種由命令物件源和一系列處理物件組成的設計模式。每個處理物件都包含定義它可以處理的命令物件型別的邏輯; 其餘的傳遞給鏈中的下一個處理物件。責任鏈模式的優勢
- 它減少了耦合。
- 它在為物件分配職責時增加了靈活性。
- 它允許一組類作為一個類; 在一個類中生成的事件可以在組合的幫助下傳送到其他處理程式類。
結構
參與者
1.處理程式
- 定義用於處理請求的介面。
- (可選)實現後續連結。
2. ConcreteHandler
- 處理它負責的請求。
- 可以訪問其繼任者。
- 如果ConcreteHandler可以處理該請求,則處理; 否則
- 它將請求轉發給其繼任者。
3.客戶端
- 向鏈上的ConcreteHandler物件啟動請求
合作
- 當客戶端發出請求時,請求將沿著鏈傳播,直到ConcreteHandler物件負責處理它。
原始碼
第1步:首先我們有請求類
public class Request { private final RequestType requestType; private final String requestDescription; private boolean handled; public Request(final RequestType requestType, final String requestDescription) { this.requestType = Objects.requireNonNull(requestType); this.requestDescription = Objects.requireNonNull(requestDescription); } public String getRequestDescription() { return requestDescription; } public RequestType getRequestType() { return requestType; } public void markHandled() { this.handled = true; } public boolean isHandled() { return this.handled; } @Override public String toString() { return getRequestDescription(); } } public enum RequestType { DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX } |
第2步:然後是請求處理程式層次結構
public abstract class RequestHandler { private static final Logger LOGGER = LoggerFactory.getLogger(RequestHandler.class); private RequestHandler next; public RequestHandler(RequestHandler next) { this.next = next; } public void handleRequest(Request req) { if (next != null) { next.handleRequest(req); } } protected void printHandling(Request req) { LOGGER.info("{} handling request \"{}\"", this, req); } @Override public abstract String toString(); } public class OrcCommander extends RequestHandler { public OrcCommander(RequestHandler handler) { super(handler); } @Override public void handleRequest(Request req) { if (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) { printHandling(req); req.markHandled(); } else { super.handleRequest(req); } } @Override public String toString() { return "Orc commander"; } } // OrcOfficer and OrcSoldier are defined similarly as OrcCommander |
第3步:然後我們有Orc King給出訂單並形成鏈
public class OrcKing { RequestHandler chain; public OrcKing() { buildChain(); } private void buildChain() { chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null))); } public void makeRequest(Request req) { chain.handleRequest(req); } } |
步驟4:然後使用如下
OrcKing king = new OrcKing(); king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle" king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner" king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax" |
適用場景
多個物件可以處理請求,並且處理程式不是先前已知的。應自動確定處理程式
您希望向幾個物件之一發出請求,而不明確指定接收方
應動態指定可以處理請求的物件集。
相關文章
- Chain of responsibility-責任鏈模式AI模式
- C#設計模式-責任鏈模式(Chain of Responsibility Pattern)C#設計模式AI
- 設計模式-職責鏈模式(Chain of Responsibility)設計模式AI
- c/c++ 設計模式-----職責鏈(Chain Of Responsibility)模式C++設計模式AI
- C++設計模式——職責鏈模式( Chain of Responsibility Pattern)C++設計模式AI
- 責任鏈模式模式
- 責任鏈模式妙用模式
- 「責任鏈模式」栗子模式
- 責任鏈模式探究模式
- 談 C++17 裡的 Chain of Responsibility 模式C++AI模式
- 設計模式 —— 責任鏈模式設計模式
- Java責任鏈模式(ChainofResponsibility模式)Java模式AI
- 設計模式(責任鏈模式)設計模式
- 設計模式-責任鏈模式設計模式
- 5、php責任鏈模式PHP模式
- 23_責任鏈模式模式
- PHP-責任鏈模式PHP模式
- 這就是『責任鏈模式』?模式
- 設計模式(三) 責任鏈模式設計模式
- 設計模式之責任鏈模式設計模式
- 設計模式之——責任鏈模式設計模式
- Design Patterns in Android:責任鏈模式Android模式
- Netty中的責任鏈模式Netty模式
- 責任鏈模式(案例解析)(9)模式
- 責任鏈模式的實踐模式
- 聊一聊責任鏈模式模式
- JAVA設計模式之責任鏈模式Java設計模式
- 設計模式系列之「責任鏈模式」設計模式
- PHP 設計模式之責任鏈模式PHP設計模式
- 極簡設計模式-責任鏈模式設計模式
- 用Lambda重構責任模式鏈模式
- 設計模式(四)OkHttp的責任鏈模式設計模式HTTP
- Java學設計模式之責任鏈模式Java設計模式
- 設計模式第七講-責任鏈模式設計模式
- 我的Java設計模式-責任鏈模式Java設計模式
- 代理模式增強之路(代理+責任鏈模式)模式
- c#中責任鏈模式詳解C#模式
- 責任鏈模式在SpringAOP中的使用模式Spring