设计模式-责任链模式
什么是責任鏈模式
在講責任鏈模式之前,我們先來看一下它的定義
責任鏈模式(Chain of Responsibility Pattern),顧名思義,它為請求創建了一個接收者對象的鏈。為了避免請求發送者與多個請求處理者耦合在一起,于是將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈,當有請求發生時,可將請求沿著這條鏈傳遞,直到有對象處理它為止。(責任鏈模式也叫職責鏈模式)
通俗點來說,它為了保證讓多個對象都有可能接收請求,于是就將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止,同時實現了請求發送者與請求接收者直接的解耦。(請求發送者只需要將請求發送到責任鏈上即可,無須關心請求的處理細節和請求的傳遞過程,請求會自動進行傳遞,即實現了二者之間的解耦)
責任鏈模式中的三個角色:
- 抽象處理者(Handler)角色:定義一個處理請求的接口,包含抽象處理方法和一個后繼連接。
- 具體處理者(Concrete Handler)角色:實現抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉給它的后繼者。
- 客戶類(Client)角色:創建處理鏈,并向鏈頭的具體處理者對象提交請求,它不關心處理細節和請求的傳遞過程。
責任鏈模式的實現
責任鏈模式實現背景: 我們在開發應用系統的過程中,經常會遇到記錄日志的需求。日志分為三種類型,分是INFO(消息)、DEBUG(調試) 、ERROR(報錯),當需要記錄日志的時候,通過判斷看看日志屬于哪種類型, 然后對應的日志處理類再去處理相應的日志信息。
創建抽象的日志記錄器類
public abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;/*** 責任鏈中的下一個元素*/protected AbstractLogger nextLogger;public void setNextLogger(AbstractLogger nextLogger){this.nextLogger = nextLogger;}public void logMessage(int level, String message){if(this.level <= level){write(message);}if(nextLogger !=null){nextLogger.logMessage(level, message);}}abstract protected void write(String message); } 復制代碼創建擴展了該記錄器類的實體類
class InfoLogger extends AbstractLogger {public InfoLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Info Logger:" + message);} }class DeBugLogger extends AbstractLogger {public DeBugLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("DeBug Logger:" + message);} }class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Error Logger:" + message);} } 復制代碼創建不同類型的記錄器
public class Test {private static AbstractLogger getChainOfLoggers(){AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);AbstractLogger deBugLogger = new DeBugLogger(AbstractLogger.DEBUG);AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);infoLogger.setNextLogger(deBugLogger);deBugLogger.setNextLogger(errorLogger);return infoLogger;}public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "這是普通日志信息");loggerChain.logMessage(AbstractLogger.DEBUG,"這是調試日志信息");loggerChain.logMessage(AbstractLogger.ERROR,"這是錯誤日志信息");} } 復制代碼責任鏈模式的優、缺點
最后我們總結一下責任鏈模式的優點與缺點
優點
優點一:降低耦合度。它將請求的發送者和接收者解耦。
優點二:簡化了對象。使得對象不需要知道鏈的結構。
優點三:增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
優點四:增加新的請求處理類很方便。
優點五:實現了責任分擔。每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個對象完成,明確各類的責任范圍,符合類的單一職責原則。
缺點
缺點一:不能保證每個請求一定被處理。由于一個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理。
缺點二:對比較長的職責鏈,請求的處理可能涉及多個處理對象,系統性能將受到一定影響。
缺點三:職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的復雜性,可能會由于職責鏈的錯誤設置而導致系統出錯,如可能會造成循環調用。
缺點四:可能不容易觀察運行時的特征,給排查錯誤增加了難度。
總結
以上是生活随笔為你收集整理的设计模式-责任链模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos8 yum安装Nginx
- 下一篇: 蓝牙开源协议栈BTstack汇总