Heim  >  Artikel  >  Web-Frontend  >  Instanzmethoden des JavaScript-Chain-of-Responsibility-Musters

Instanzmethoden des JavaScript-Chain-of-Responsibility-Musters

小云云
小云云Original
2018-01-27 09:44:571446Durchsuche

In diesem Artikel wird hauptsächlich ein Überblick über das in JavaScript implementierte Chain-of-Responsibility-Modell gegeben. Interessierte Freunde können sich darauf beziehen Ich hoffe, es kann allen helfen.

Was ist das Chain-of-Responsibility-Muster?

Die Definition des Chain-of-Responsibility-Musters besteht darin, mehreren Objekten die Möglichkeit zu geben, die Anfrage zu bearbeiten Dadurch wird vermieden, dass der Absender der Anforderung und die Kopplungsbeziehung zwischen den Empfängern diese Objekte zu einer Kette verbinden und die Anforderung entlang dieser Kette weiterleiten, bis ein Objekt sie verarbeitet. Wenn Sie zum Beispiel durch die Hintertür in den Bus einsteigen, können Sie die Münzen nicht direkt in die Geldkassette werfen, weil Sie nicht wissen, wo sie ist. Dann können Sie die Münzen nur der Person vor Ihnen geben und lassen Sie sich von ihm helfen, es an die Person vor Ihnen weiterzugeben, und geben Sie es dann an die Person weiter, die neben der Geldkassette steht, die die Münzen in die Geldkassette wirft.

Idee des Chain-of-Responsibility-Modells

Der Absender der Anfrage muss nur den ersten Knoten in der Kette kennen, wodurch die starke Verbindung zwischen dem Absender und einer Gruppe von Empfängern geschwächt wird . verbinden.

JavaScript implementiert das Chain-of-Responsibility-Modell (AOP-Methode)


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

Ja, implementieren Sie das Chain-of-Responsibility-Modell in JavaScript. Das Muster ist so einfach. Wenn Sie den obigen AOP-Code nicht verstehen, können Sie auf diesen Artikel zurückgreifen, den ich zuvor geschrieben habe. Diese Methode sieht dem Dekoratormuster sehr ähnlich , aber ihr Ausgangspunkt ist völlig anders

AOP implementiert das Dekoratormuster: Das Hinzufügen einiger neuer Funktionen, ohne die Interna bestehender Funktionen zu ändern, ist gleichbedeutend mit dem Geben von Ihnen Ein weiterer Kreis wird außerhalb des Kreises hinzugefügt, um ihn zu umschließen. Beachten Sie, dass es sich um inklusive Beziehungen handelt.

AOP implementiert das Chain-of-Responsibility-Modell: Bestimmen Sie, ob die nächste Funktion ausgeführt werden soll, nachdem die Funktion ausgeführt wurde. Dies entspricht dem Hinzufügen einer Funktion nach der vorhandenen Funktion Ob die folgende Funktion ausgeführt werden soll, hängt vom Rückgabewert der vorherigen Funktion ab. Beachten Sie, dass es sich um Kettenbeziehungen handelt

Beispiele für Chain of Responsibility-Muster


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"); //我是猫猫

Bitte schauen Sie sich den obigen Code an, wir übergeben ihn es zur Pet-Methode Es wurden drei verschiedene Parameter eingegeben und unterschiedliche Ergebnisse erhalten. Nehmen Sie den ersten Aufruf als Beispiel: Übergeben Sie „pig“, das zuerst von der cat-Methode beurteilt wird, und übergibt daher „pig“ an die dog-Methode (Die Rückgabe von „nextSuccessor“ stellt die Übertragung zur nächsten Funktion dar), die Dog-Methode stellt fest, dass sie damit nicht umgehen kann, und übergibt dann „pig“ an die Pig-Methode. Die Pig-Methode kann damit umgehen, und die Konsole druckt „I am a“. Schwein.

Sie denken vielleicht, dass dies keine Energieverschwendung ist, indem Sie einfach die folgenden Codezeilen verwenden


function pet(type) {
  if(type == "cat") {
    console.log("我是猫猫");
  } else if(type == "dog") {
    console.log("我是狗狗");
  } else if(type == "pig") {
    console.log("我是猪猪");
  }
}

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

So betrachtet scheint es viel einfacher zu sein. Aber haben Sie jemals darüber nachgedacht, dass Sie, wenn in Zukunft plötzlich Affen auftauchen, den Quellcode der Haustierfunktion ändern und eine if-Anweisung hinzufügen müssen, um festzustellen, ob es sich tatsächlich um einen Affen handelt? Das ist nicht schlecht, was wäre, wenn 10.000 Tiere dazukämen? Dann müssen Sie der Haustierfunktion 10.000 if-Anweisungen hinzufügen, was? Nicht auffällig genug? Haben Sie schon einmal darüber nachgedacht, dass ein Tier in viele Rassen eingeteilt werden kann? Katzen werden beispielsweise in Langhaarkatzen und Kurzhaarkatzen eingeteilt. Auf diese Weise enthält Ihr Code verschachtelte if-Anweisungen. Bei allem Respekt, Ihr Code ist jetzt so hässlich wie ein Hund, hee hee

Aber wenn Sie das Chain-of-Responsibility-Modell verwenden, definieren wir für jedes weitere Tier eine Funktion dafür und fügen sie dann hinzu Die Verantwortungskette ist auf diese Weise stark von der ursprünglichen Funktion entkoppelt, ist das nicht schön?

Verwandte Empfehlungen:

PHP Design Pattern – Chain of Responsibility Pattern_PHP Tutorial

PHP Design Pattern Chain of Responsibility (Chain Verantwortungsmodus)

PHP Design Pattern Chain of Responsibility Modus

Das obige ist der detaillierte Inhalt vonInstanzmethoden des JavaScript-Chain-of-Responsibility-Musters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn