[設計模式] javascript 之 責任鏈模式

責任鏈模式:定義this

責任連接模式又稱職責鏈模式,是一種對象的行爲模式;它是一種鏈式結構,每一個節點都有可能兩種操做,要麼處理該請求中止該請求操做,要麼把請求轉發到下一個節點,讓下一個節點來處理請求;該模式定義了一些可能的處理請求的節點對象,請求的起點跟順序均可能不同,處理的節點根據請求的不同而不一樣;請求者沒必要知道數據處理完成是由誰來操做的,內部是一個黑箱的操做過程,這是它的一個核心內容;spa

責任鏈模式:角色prototype

抽象處理者角色:定義處理方法,以配置是否具備下個節點(Handler)對象;3d

具體處理者角色:定義處理方法的具體執行邏輯,判斷是否能夠處理該請求,若是能夠就處理(返回結果結束);若是不行,就查看是有下個節點,有的話就傳遞給下家;code

使用場景對象

好比公司採購申請,好比說部門或團隊旅遊申請等等,一切可能須要通過幾個流程直到某個流程節點可以處理它爲止的狀況;blog

部門最近由於某個項目須要採購一批設備,價值可能在幾十萬左右,部門經理讓其下的同事A,上OA寫了個採購申請;這個申請首先進入採購部負責人這裏,因爲金額很大,他沒辦法直接處理(固然他還能夠寫下意見),就轉交上級公司總經理處理,總經理有權處理這麼大金額的採購,就寫個贊成就經過了;源碼

若是總經理也沒有處理這種金額的權限,也就只能再轉交更上層董事長來處理決定;io

固然,這其中可能遇到特殊狀況,好比說採購部負責人不在,項目又很是着急;又或者這個大項目是總經理直接監督負責的,可是又需按流程有記錄,就能夠發個OA,直接將這個採購跳過採購部,直接到總經理這邊。console

模型結構

 

事例源碼

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);
}

其餘說明 

責任鏈模式,總的一個核心就是請求者沒必要知道是誰哪一個節點對象處理的請求,因爲處理請求的能夠不一樣對象下處理,因此請求者跟接受者是解耦的。

純的責任鏈:要求請求在這些對象鏈中必須被處理,並且一個節點處理對象,要麼只處理請求,要麼把請求轉發給下個節點對象處理;

不純的責任鏈:要求在責任鏈裏不必定會有處理結構,並且一個節點對象,便可以處理部分請求,並把請求再轉發下個節點處理;

相關文章
相關標籤/搜索