二十二、責任鏈模式

目錄

      • 1、使用demo演示責任鏈模式
      • 2、傳統方案解決oa系統審批
      • 3、傳統方案解決oa系統審批存在的問題
      • 4、職責鏈模式基本介紹
      • 5、職責鏈模式原理類圖
      • 6、職責鏈模式解決oa系統采購審批
      • 7、職責鏈模式的注意事項和細節
      • 8、職責鏈模式的實際使用場景舉例

1、使用demo演示責任鏈模式

學校oa系統的采購審批項目:需求是
在這里插入圖片描述


2、傳統方案解決oa系統審批

在這里插入圖片描述
在一個類中對教學器材的價格進行判斷,然后根據判斷調用不同的審批者進行審批


3、傳統方案解決oa系統審批存在的問題

  • 客戶端這里會使用分支判斷來對不用的采購請求進行處理,這樣就存在如下問題
    • 如果各個級別的人員審批金額發生變化,客戶端也需要相應變化
    • 客戶端必須明確知道有多少個審批級別
  • 采購請求和審批人員之間存在強耦合關系,不利于代碼的擴展和維護

4、職責鏈模式基本介紹

職責鏈模式又稱為責任鏈模式:每個接收者都包含對另一個接收者的引用,如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依次類推


5、職責鏈模式原理類圖

在這里插入圖片描述

對職責鏈模式的說明:

  • Handler:抽象的處理者,定義了一個處理請求的方法,并且聚合了自身
  • ConcreteHandlerA|B:是具體的處理者,處理它自己負責的請求,可以訪問它的后繼者,如果可以處理當前請求,則處理,否則將該請求交給下個后繼者去處理,從而形成一個職責鏈

6、職責鏈模式解決oa系統采購審批

1)類圖分析
在這里插入圖片描述
2)代碼實現

// 購買請求
public class PurchaseRequest {//private int type;private float price;private int id;public PurchaseRequest(int type, float price, int id) {this.type = type;this.price = price;this.id = id;}public int getType() {return type;}public float getPrice() {return price;}public int getId() {return id;}
}// 審批者抽象類
public abstract class Approver {Approver approver; // 下一個處理者String name;public Approver(String name) {this.name = name;}// 設置下一個處理者public void setApprover(Approver approver) {this.approver = approver;}// 處理 審批請求的方法,得到一個請求public abstract void processRequest(PurchaseRequest purchaseRequest);
}/***  部門主任*/
public class DepartmentApprover extends Approver {public DepartmentApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() <= 5000) {System.out.println("請求編號 id = " + purchaseRequest.getId() + "被" + this.name + "處理");} else {// 如果不能處理,則讓下一個處理者進行處理approver.processRequest(purchaseRequest);}}
}/*** 系主任*/
public class CollegeApprover extends Approver {public CollegeApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 10000) {System.out.println("請求編號 id = " + purchaseRequest.getId() + "被" + this.name + "處理");} else {// 如果不能處理,則讓下一個處理者進行處理approver.processRequest(purchaseRequest);}}
}/*** 副校長*/
public class ViceSchoolMasterApprover extends Approver {public ViceSchoolMasterApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 10000 && purchaseRequest.getPrice() <= 30000) {System.out.println("請求編號 id = " + purchaseRequest.getId() + "被" + this.name + "處理");} else {// 如果不能處理,則讓下一個處理者進行處理approver.processRequest(purchaseRequest);}}
}
/*** 校長*/
public class SchoolMasterApprover extends Approver {public SchoolMasterApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 30000) {System.out.println("請求編號 id = " + purchaseRequest.getId() + "被" + this.name + "處理");} else {// 如果不能處理,則讓下一個處理者進行處理approver.processRequest(purchaseRequest);}}
}public class Client {public static void main(String[] args) {PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);	DepartmentApprover departmentApprover = new DepartmentApprover("張主任");CollegeApprover collegeApprover = new CollegeApprover("李院長");ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校");SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校長");//需要將各個審批級別的下一個設置好 (處理人構成環形: )departmentApprover.setApprover(collegeApprover);collegeApprover.setApprover(viceSchoolMasterApprover);viceSchoolMasterApprover.setApprover(schoolMasterApprover);schoolMasterApprover.setApprover(departmentApprover);departmentApprover.processRequest(purchaseRequest);}
}

在這里插入圖片描述


7、職責鏈模式的注意事項和細節

  • 將請求和處理分開,實現解耦,提高系統的靈活性
  • 性能收到影響,特別是在鏈比較長的時候。因此需要控制鏈中最大節點數量,一般通過在Handler中設置一個
    最大節點數量,在setNext方法中判斷是否已經超過閾值,超過則不允許建立改節點
  • 由于采取了鏈的方式,所以調試邏輯比較復雜

8、職責鏈模式的實際使用場景舉例

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫相關面試題

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 mysql怎么優化 : MySQL的優化可以從以下幾個方面入手&#xff1a; 數據庫設計優化&#xff1a;合理設計表結構&#xff0c;選擇合適的數…

GitHub 如何部署寫好的H5靜態頁面

感謝粉皮zu的私信&#xff0c;又有素材寫筆記了。(●’?’●) 剛好記錄一下我示例代碼的GitHub部署配置&#xff0c;以便于后期追加倉庫。 效果 環境 gitwin 步驟 第一步 新建倉庫 第二步 拉取代碼 將倉庫clone到本地 git clone 地址第三步 部署文件 新建.github\workflo…

vue-pc端elementui-統一修改問題-Dialog 對話框點擊空白關閉問題-element-所有組件層級問題

前言 實際開發我們經常發現dialog彈出框默認點擊遮罩層空白地方就會關閉-有屬性可以關閉 但是經常會圖方便-或者已經寫完了&#xff0c;不想一個個寫&#xff0c;可以在main.js進行統一關閉 當我們在頁面進行復雜設計和層級關閉改變&#xff0c;會發現右上角的退出登錄彈出款…

現代無人機技術

目錄 1.發展 2.應用領域 3.對戰爭的影響 4.給人類帶來的福利 5.給人類帶來的壞處 1.發展 無人機的發展可以分為以下幾個關鍵步驟&#xff1a; 1. 早期試驗和研究&#xff1a;20世紀初&#xff0c;飛行器的概念開始出現&#xff0c;并進行了一些早期的試飛和實驗。這些嘗試包…

LeetCode150道面試經典題-- 有效的字母異位詞(簡單)

1.題目 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 2.示例 s"adasd" t"daads" 返回true s"addad" t &q…

常見設計模式

概念 設計模式是怎么解決問題的一種方案 常見的設計模式 單例模式 概念&#xff1a;保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全局訪問點。 應用&#xff1a;項目封裝個websocket用于大屏&#xff0c;redux&#xff0c;vuex都應用了單例模式的思想&#xff1b…

文獻閱讀:AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators

文獻閱讀&#xff1a;AnnoLLM: Making Large Language Models to Be Better Crowdsourced Annotators 1. 文章簡介2. 方法介紹3. 實驗考察 1. 實驗結果2. 消解實驗3. Consistency & Stability 4. 結論 & 思考 文獻鏈接&#xff1a;https://arxiv.org/abs/2303.16854 …

Golang設計模式

Golang設計模式 Golang設計模式簡介Golang工廠設計模式Golang單例設計模式Golang抽象工廠設計模式Golang建造者模式 (Builder Pattern)Golang 原型模式(Prototype Pattern)Golang適配器模式Golang 橋接模式&#xff08;Bridge Pattern&#xff09;Golang裝飾器模式(Decorator …

j東h5st參數多局部ob加密(js_security_v3_0.1.4.js)加密分析

j東h5st參數多局部多次ob加密&#xff08;js_security_v3_0.1.4.js&#xff09; 大家好呀&#xff0c;我是你們的好兄弟&#xff0c;【星云horseAK】&#xff0c;今天的主題真的是千呼萬喚始出來&#xff0c;某東東的h5st參數&#xff0c;這個加密的js文件使用了obfuscator進行…

《Java-SE-第三十六章》之枚舉

前言 在你立足處深挖下去,就會有泉水涌出!別管蒙昧者們叫嚷:“下邊永遠是地獄!” 博客主頁&#xff1a;KC老衲愛尼姑的博客主頁 博主的github&#xff0c;平常所寫代碼皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇島的新手&#xff0c;水平很有限&…

Linux 日志管理

Linux 日志管理 一.Linux 下的日志服務簡介 1.1 CentOS5 之前的版本 centos5 之前的版本使用系統和內核日志分離的格式記錄日志 syslogd:該服務專門用于記錄系統日志(system application logs) klogd: 該服務專門用于記錄內核日志(linux kernel logs) centos5 之前事件的記錄格…

Redis_Geospatial(基于位置信息的應用)

12.Geospatial 12.1 簡介 基于位置信息服務(Location-Based Service,LBS)的應用。Redis3.2版本后增加了對GEO類型的支持。主要來維護元素的經緯度。redis基于這種類型&#xff0c;提供了經緯度設置、查詢、范圍查詢、距離查詢、經緯度hash等一些相關操作 12.2 GEO底層結構 …

war和war exploded

war和war exploded的區別 war模式&#xff1a;將WEB工程以包的形式上傳到服務器 &#xff1b; war exploded模式&#xff1a;將WEB工程以當前文件夾的位置關系上傳到服務器&#xff1b;>> war包是自己打包生成的&#xff0c;如pom文件中<packaging>war</packag…

使用 Visual Studio Code 調試 CMake 腳本

之前被引入到 Visual Studio 中的 CMake 調試器&#xff0c;現已在 Visual Studio Code 中可用。 也就是說&#xff0c;現在你可以通過在 VS Code 中安裝 CMake 工具擴展&#xff0c;來調試你的 CMakeLists.txt 腳本了。是不是很棒? 背景知識 Visual C 開發團隊和 CMake 的維…

Flutter源碼分析筆記:Widget類源碼分析

Flutter源碼分析筆記 Widget類源碼分析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/132259681 【介紹】&#x…

TestNG和Junit5測試框架梳理

一、testNG 1. testNG優勢 注解驅動&#xff1a; TestNG 使用注解來標識測試方法、測試類和配置方法&#xff0c;使得測試更具可讀性。 并行執行&#xff1a; TestNG 支持多線程并行執行測試&#xff0c;可以加速測試套件的執行。 豐富的配置&#xff1a; 可以通過 XML 配置文…

Qt下載安裝及配置教程

進入qt中文網站&#xff1a;https://www.qt.io/zh-cn/ 下載開源版 往下滑&#xff0c;下載Qt在線安裝程序 它已經檢測出我的是windows系統&#xff0c;直接點擊download就好。如果是其它的系統&#xff0c;需要找到對應自己系統的安裝包。 然后跟網速有關&#xff0c;等…

Gitlab CI/CD筆記-第三天-使用主機docker in docker 進行構建并push鏡像。

一、啥叫docker in docker 就是允許的鏡像里頭有一個docker,但這個docekr鏡像只有docker的cli和/var/lib/docker.sock的套接字&#xff0c;沒有允許build.然后里頭又運行了一個docker&#xff0c;這個docker有build的能力&#xff0c;此時構建時就是里頭的docker使用外部的dock…

登錄驗證碼實現

Hutool代碼改造 Hutool 有參考文檔&#xff1b;很多工具類&#xff1b;把一些功能都封裝好&#xff1b;都不用你自己去寫&#xff1b;直接調用它的工具類 它這里會詳細告訴你引入方式Hutool <dependency><groupId>cn.hutool</groupId><artifactId>hu…