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