ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の責任連鎖パターンのインスタンス メソッド

JavaScript の責任連鎖パターンのインスタンス メソッド

小云云
小云云オリジナル
2018-01-27 09:44:571407ブラウズ

この記事では主にJavaScriptで実装される責任連鎖モデルの概要を紹介していますので、興味のある方は参考にしていただければと思います。みんなを助けることができる。

責任連鎖パターンとは

責任連鎖パターンの定義は、複数のオブジェクトにリクエストを処理する機会を与え、それによってリクエストの送信者と受信者の間の結合関係を回避することです。これらのオブジェクトを 1 つのチェーンに接続し、オブジェクトが処理するまでそのチェーンに沿ってリクエストを渡します。例えば、バスに後部ドアから乗る場合、どこにあるのか分からないので直接小銭を入れることはできず、前の人に渡すしかありません。そして、目の前の人にそれを渡し、次に金庫の隣に立っている人の手に渡し、その人が硬貨を金庫に入れます。

責任連鎖パターンのアイデア

リクエストの送信者はチェーン内の最初のノードのみを知る必要があるため、送信者と受信者のグループの間の強いつながりが弱まります。

JavaScript は責任連鎖モード (AOP メソッド) を実装します


 Function.prototype.after = function(fn) {
  var _self = this;

  return function () {
    var ret = _self.apply(this, arguments);
    if(ret === "nextSuccessor") {
     return fn.apply(this, arguments);
    }
    return ret;
  }
 }

はい、JavaScript で責任連鎖モードを実装するのは非常に簡単です。上記の AOP コードが理解できない場合は、以下を参照してください。以前書いたこの記事 この記事は JavaScript で AOP を実装します。 : 既存の関数の内部状況を変更せずに、以下にいくつかの新しい関数を追加します。これは、円の外側に別の円を追加して包むことと同じです。これらは包含的な関係であることに注意してください

AOP は責任の連鎖モデルを実装します。関数が実行された後に次の関数を実行するかどうかを決定するのは、既存の関数の後に関数を追加するのと同じです。後の関数を実行するかどうかは、前の関数の戻り値に依存します。これらは連鎖関係であることに注意してください

責任の連鎖パターンの例

function cat (type) {
  if(type == "cat") {
    console.log("我是猫猫");
  } else {
    return "nextSuccessor"
  }
}

function dog (type) {
  if(type == "dog") {
    console.log("我是狗狗");
  } else {
    return "nextSuccessor"
  }
}

function pig (type) {
  if(type == "pig") {
    console.log("我是猪猪");
  } else {
    return "nextSuccessor"
  }
}

Function.prototype.after = function(fn) {
  var _self = this;

  return function () {
    var ret = _self.apply(this, arguments);
    if(ret === "nextSuccessor") {
      return fn.apply(this, arguments);
    }
    return ret;
  }
}


var pet = cat.after(dog).after(pig);

pet("pig"); //我是猪猪
pet("dog"); //我是狗狗
pet("cat"); //我是猫猫

上記のコードを見てください。pet メソッドに 3 つの異なるパラメーターを渡し、異なる結果が得られました。最初の呼び出しを例に挙げると、実行プロセスは次のとおりです。 cat メソッドで最初に判断された "pig" を渡します。 (return "nextSuccessor" は次の関数への転送を表します)、dog メソッドはそれを処理できないことがわかり、pig メソッドに "pig" を渡します。 pig メソッドはそれを処理でき、コンソールに「I am a」と出力されます。豚。

これはエネルギーの無駄ではないと思われるかもしれませんが、上記の関数は次のコード行を使用するだけで解決できます。なぜこれほど多くのコードを記述する必要があるのでしょうか?はるかに簡単です。しかし、将来猿が突然現れた場合、上記のゴミコードを使用すると、pet 関数のソース コードを変更して、猿であるかどうかを判断するための if ステートメントを追加する必要があることを考えたことはありますか。これは悪くありませんが、10,000 匹の動物が追加されたらどうなるでしょうか。次に、pet 関数に 10,000 の if ステートメントを追加する必要があります。派手さが足りませんか?たとえば、猫は長毛種と短毛種に分けられることを考えたことはありますか。このようにして、コードにはネストされた if ステートメントが含まれます。敬意を表しますが、あなたのコードは今では犬のように醜いです、ヒヒ

しかし、責任連鎖モデルを使用する場合、追加の動物ごとに関数を定義し、それを責任連鎖に追加します。このように、新しい機能は元の機能から高度に分離されています。


関連推奨事項:

PHP デザイン パターン - 責任連鎖パターン_PHP チュートリアル


php デザイン パターン 責任連鎖 (責任連鎖パターン)

PHP デザイン パターン 責任連鎖パターン

以上がJavaScript の責任連鎖パターンのインスタンス メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。