JavaScriptの責任連鎖パターンの例

1.責任の連鎖の定義:複数のオブジェクトが要求を処理する機会を持てるようにすることで、要求の送信者と受信者の間の結合関係を回避し、これらのオブジェクトをチェーンに接続して、要求を渡します。このチェーン。オブジェクトがそれを処理するまで。

2.シナリオの説明の例:

会社の製品である携帯電話でのプロモーション活動については、次のポリシーがあります。正式な購入時に、500元の保証金を支払ったユーザーは、モールで100元の割引クーポンを受け取ります。 200元の保証金を支払うと50元を受け取ることができます。クーポン、および以前に保証金を支払ったことがないユーザーは、通常の購入モード、つまりクーポンはありません。主な危険は、購入できない可能性があることです。在庫が限られている場合の携帯電話。

3.サンプルコードは次のとおりです。

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 ); //输出:手机库存不足

4. Chain of Responsibilityモデルの利点:

上記のコードにより、ノードを柔軟に追加および削除したり、ノードの順序を柔軟に変更したりできます。


おすすめ

転載: blog.csdn.net/joyksk/article/details/79863182