JavaScriptの職責チェーンパターン例

2342 ワード

一、職責チェーンの定義:複数のオブジェクトに要求を処理する機会を与え、要求の送信者と受信者との間の結合関係を回避し、これらのオブジェクトをチェーンに接続し、このチェーンに沿って要求を伝達し、オブジェクトがそれを処理するまで.
二、実例シーン説明:
ある会社は会社の製品-携帯電話に対して販促活動を行っています.正式に購入する時、すでに500元の予約金を支払ったユーザーは100元のショッピングモールのクーポンを受け取ります.200元の予約金を支払うユーザーは50元のクーポンをもらえます.以前に予約金を払っていなかったユーザーは普通の購入モードに入るしかないです.つまり、クーポンはありません.主な危険は在庫が限られている場合に携帯電話が買えるとは限らないです.
三、実例コードは以下の通りです.
1、3で購入したモードの関数オブジェクトを作成します.
/**
* @param: orderType       
* @param: pay             
* @param: stock                  ,            
**/

var order500 = function( orderType, pay, stock ){
    if( orderType === 1 && pay === true)
         console.log('500     ,  100   ');
    else
         return 'nextSuccessor';  //          ,          
};

var order200 = function( orderType, pay, stock){
   if( orderType === 2 && pay === true)
        console.log( '200     ,  50    ' );
    else
        return 'nextSuccessor';
};

var orderNormal = function(orderType, pay, stock){
   if(stock > 0)
       console.log('    ,    ');
    else
        console.log('      ');
};
2、一つの関数を職能チェーンノードに包装する構造関数を書くと、次のようになります.
var Chain = function(fn){
   this.fn = fn;
   this.successor = null;
};

Chain.prototype.setNextSuccessor = function( successor ){
    return this.successor = successor;
};

Chain.prototype.passRequest = function(){
    var ret = this.fn.apply( this, arguments );

    if( ret === 'nextSuccessor'){
        return this.successor && this.successor.passRequest.apply( this,successor, arguments );
    }

     return ret;
};
3、コールは以下の通りです
1>3つの注文関数をそれぞれ職責チェーンに包装するノード:
var chainOrder500 = new Chain( order500 );
var chainOrder200 = new Chain( order200 );
var chainOrderNormal = new Chain( orderNormal );
2>指定されたセクションの現在のチェーンの順序:
chainOrder500.setNextSuccessor( chainOrder200 );
chainOrder200.setNextSuccessor( chainOrderNormal );
3>要求を第一のノードに渡すと、以下のようになる.
chainOrder500.passRequest( 1, true, 500 ); //  :500     ,  100   
chainOrder500.passRequest( 2, true, 500 ); //  :200     ,  50   
chainOrder500.passRequest( 3, true, 500 ); //  :    ,    
chainOrder500.passRequest( 1, false, 0 ); //  :      
四、職責チェーンパターンの長所:
上記のコードにより、ノードを柔軟に追加し、削除し、ノードの順序を柔軟に変更することができます.