責任鏈模式:定義
責任鏈接模式又稱職責鏈模式,是一種對象的行為模式;它是一種鏈式結構,每個節點都有可能兩種操作,要么處理該請求停止該請求操作,要么把請求轉發到下一個節點,讓下一個節點來處理請求;該模式定義了一些可能的處理請求的節點對象,請求的起點跟順序都可能不一樣,處理的節點根據請求的不一樣而不同;請求者不必知道數據處理完成是由誰來操作的,內部是一個黑箱的操作過程,這是它的一個核心內容;
責任鏈模式:角色
抽象處理者角色:定義處理方法,以配置是否具有下個節點(Handler)對象;
具體處理者角色:定義處理方法的具體執行邏輯,判斷是否可以處理該請求,如果可以就處理(返回結果結束);如果不行,就查看是有下個節點,有的話就傳遞給下家;
使用場景
比如公司采購申請,比如說部門或團隊旅游申請等等,一切可能需要經過幾個流程直到某個流程節點能夠處理它為止的情況;
部門最近因為某個項目需要采購一批設備,價值可能在幾十萬左右,部門經理讓其下的同事A,上OA寫了個采購申請;這個申請首先進入采購部負責人這里,由於金額很大,他沒辦法直接處理(當然他還可以寫下意見),就轉交上級公司總經理處理,總經理有權處理這么大金額的采購,就寫個同意就通過了;
如果總經理也沒有處理這種金額的權限,也就只能再轉交更上層董事長來處理決定;
當然,這其中可能遇到特殊情況,比如說采購部負責人不在,項目又非常着急;又或者這個大項目是總經理直接監督負責的,但是又需按流程有記錄,就可以發個OA,直接將這個采購跳過采購部,直接到總經理這邊。
模型結構
事例源碼
1. 抽象處理者角色:
function Handler() { this.next = null; this.setNext = function(_handler) { this.next = _handler; }; this.handleRequest = function(money) { } }; //采購部 function CGBHandler = function() {} CGBHandler.prototype = new Handler(); CGBHandler.prototype.handleRequest = function(money) { //處理權限最多10000 if (money < 10000){ console.log('同意'); } else { console.log('金額太大,只能處理一萬以內的采購'); if (this.next) { this.next.handleRequest(money); } } }; //總經理 function ZJLHandler = function() {} ZJLHandler .prototype = new Handler(); ZJLHandler .prototype.handleRequest = function(money) { //處理權限最多100000 if (money < 100000){ console.log('10萬以內的同意'); } else { console.log('金額太大,只能處理十萬以內的采購'); if (this.next) { this.next.handleRequest(money); } } }; //董事長 function DSZHandler = function() {} DSZHandler .prototype = new Handler(); DSZHandler .prototype.handleRequest = function(money) { //處理權限至少100000 if (money >= 100000){ console.log('10萬以上的我來處理'); //處理其他邏輯 } };
客戶端使用
function Client() { var cgb = new CGBHandler(); var zjl = new ZJLHandler(); var dsz = new DSZHandler(); cgb.setNext(zjl); zjl.setNext(dsz); cgb.handleRequest(800000); }
其他說明
責任鏈模式,總的一個核心就是請求者不必知道是誰哪個節點對象處理的請求,由於處理請求的可以不同對象下處理,所以請求者跟接受者是解耦的。
純的責任鏈:要求請求在這些對象鏈中必須被處理,而且一個節點處理對象,要么只處理請求,要么把請求轉發給下個節點對象處理;
不純的責任鏈:要求在責任鏈里不一定會有處理結構,而且一個節點對象,即可以處理部分請求,並把請求再轉發下個節點處理;