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