亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

javascript 之 責(zé)任鏈模式

原創(chuàng) 2016-11-11 16:27:14 604
摘要:責(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)

122693-20160718091828638-690212965.png

事例源碼

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)處理;


發(fā)佈手記

熱門詞條