設計模式之責任鏈模式

来源:http://www.cnblogs.com/daily-note/archive/2017/08/06/7295193.html
-Advertisement-
Play Games

定義(百度百科): 責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。 ...


定義(百度百科):

       責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。
發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。

UML類圖:

 

具體代碼:

public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setHandler(handler2);
        handler1.handlerRequest("3");
    }
}

public abstract class Handler {
    public Handler successHandler;

    public void setHandler(Handler handler) {
        successHandler = handler;
    }

    public abstract void handlerRequest(String xxx);
}

public class ConcreteHandler1 extends Handler {
    @Override
    public void handlerRequest(String xxx) {
        if ("1".equals(xxx)) {
            System.out.println("ConcreteHandler2 處理:" + xxx);
        } else {
            successHandler.handlerRequest(xxx);
        }
    }
}

public class ConcreteHandler2 extends Handler {
    @Override
    public void handlerRequest(String xxx) {
        System.out.println("ConcreteHandler2 處理:" + xxx);
    }
}

模塊說明:
Handler:定義一個處理請求的介面。
ConcreteHandler:處理它所負責的請求。如果可處理該請求,就處理,否則將該請求轉發給它的後繼者。
Client:向鏈上的具體處理者ConcreteHandler對象提交請求,組裝責任鏈。

適用場景:
有多個對象可以處理同一個請求,具體哪個對象處理該請求待運行時刻再確定,客戶端只需將請求提交到鏈上,而無須關心請求的處理對象是誰以及它是如何處理的。
在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
可動態指定一組對象處理請求,客戶端可以動態創建職責鏈來處理請求,還可以改變鏈中處理者之間的先後次序。

優缺點:
優點:
請求者和接受者松耦合。
動態的組合職責。
缺點:
產生了很多細粒度的對象
請求不保證在責任鏈上一定被處理掉。

總結:

分離各個責任塊的職責,對其進行鏈式的動態組合。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 閱讀目錄: 事件綁定 Toplevel組件 標準對話框 事件綁定 事件綁定: 說明:對於每個組件來說,可以通過bind()方法將函數或方法綁定到具體的事件上。 事件序列: 說明:用戶需要使用bind()方法將具體的事件序列與自定義的方法綁定,時間序列是以字元串的形式表示的。 語法描述: <modif ...
  • 今天我分享一個技術點,利用Spring初始化+線程接管進行程式啟動後保持會話狀態。 先來一段@test單元測試註解,後臺開發的很熟悉,這是測試局部代碼用的: RunWith和ContextConfiguration的源碼和功能就不細解釋了,不熟悉的可以去翻翻源碼。 1:我來一段@Test單元測試操作 ...
  • 工具:eclipse-nion、jdk8、python3.6、pydev eclipse -》 help -》 eclipse marketplace -》 輸入 python,install pydev 接著配置一下eclipse的解釋器以及編碼方式 新建一個項目:new -》project -》 ...
  • /** * 剪切一個文件夾,且文件夾中包含內容,有問題的地方大家可以指出 */import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileI ...
  • 本節作業: 熟練使用類和模塊,寫一個交互性強、有衝突的程式。 一、作業目的 1、規範程式寫法,要按照模塊來規範書寫; 2、類的使用,文件之間的調用練習; 3、思路的開闊,自己編寫衝突,實現調用; 4、對基礎知識的熟練掌握。 本文寫了一個決鬥系統,兩個男的為了一個女的進行決鬥,獲勝者贏得美女放心,失敗 ...
  • 本文介紹將各種Spring的配置方式,幫助您瞭解配置Spring應用的複雜性。Spring是一個非常受歡迎的Java框架,它用於構建web和企業應用。不像許多其他框架只關註一個領域,Spring框架提供了各種功能,通過項目組合來滿足當代業務需求。Spring框架提供了多種靈活的方式配置Bean。例如... ...
  • mybatis 詳解(四)------properties以及別名定義 ...
  • 目錄 · 總述 · 記憶 · 效果 · 面向對象設計原則 · 創建型模式 · 單例模式(Singleton) · 效果 · 分類 · 代碼(餓漢式) · 代碼(懶漢式) · 代碼(雙重檢測鎖式) · 代碼(靜態內部類式) · 代碼(枚舉單例) · 代碼(使用反射的破解與防禦) · 代碼(使用序列化的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...