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

javascript 之 責(zé)任鏈模式

Original 2016-11-11 16:27:14 604
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)

122693-20160718091828638-690212965.png

事例源碼

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


Release Notes

Popular Entries