einführen
Der Statusmodus ermöglicht es einem Objekt, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert, und das Objekt scheint seine Klasse zu ändern.
Text
Wenn wir beispielsweise Dinge herunterladen, haben wir normalerweise mehrere Staaten, wie ReadyState, DownloadingState, PaspusedState, DownloadedState, DownloadedState und FailedState. Das heißt, in jedem Staat können Sie nur das tun, was der aktuelle Zustand kann, aber nicht, was andere Staaten tun können.
Da das Statusmuster beschreibt, wie sich Downloads (Download) in jedem Zustand unterschiedlich verhalten. Die Schlüsselidee dieses Musters besteht darin, eine abstrakte Klasse namens State (oder eine Funktion in JS) einzuführen, um den Download -Status darzustellen. Die Zustandsfunktion (als Prototyp) deklariert einige gemeinsame Schnittstellen für Unterklassen (Erbschaftsfunktionen) jedes Zustands. Jede Vererbungsfunktion implementiert Verhaltensweisen, die sich auf einen bestimmten Zustand beziehen, z. B. DownloadingState bzw. DownloadedState implementiert die Verhaltensweisen, die heruntergeladen und heruntergeladen werden. Diese Verhaltensweisen können durch Download aufrechterhalten werden.
Lassen Sie uns ein Spiel implementieren, definieren Sie zunächst die Statusfunktion als Prototyp anderer Grundfunktionen:
Die Codekopie lautet wie folgt:
var state = function () {
};
State.prototype.download = function () {
Neuen Fehler werfen ("Diese Methode muss überladen sein!");
};
State.prototype.pause = function () {
Neuen Fehler werfen ("Diese Methode muss überladen sein!");
};
State.prototype.fail = function () {
Neuen Fehler werfen ("Diese Methode muss überladen sein!");
};
State.prototype.finish = function () {
Neuen Fehler werfen ("Diese Methode muss überladen sein!");
};
Wir definieren 4 Methodenschnittstellen für den Prototyp des Zustands, der dem Download (Download), Pause, Fehler und Ende entspricht, damit die Unterfunktion neu geschrieben werden kann.
Bevor wir eine Unterfunktion schreiben, schreiben wir zunächst eine ReadyState -Funktion, damit der Status an den ersten Download -Status übergeben werden kann:
Die Codekopie lautet wie folgt:
var ReadyState = Funktion (odownload) {
State.Apply (dies);
this.odownload = odownload;
};
ReadyState.Prototype = neuer Zustand ();
ReadyState.Prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
// Nach dem Fertigen können Sie mit dem Herunterladen beginnen, damit Sie die staatliche Akquisitionsmethode in der Download -Funktion festlegen
console.log ("Download starten!");
};
ReadyState.Prototype.pause = function () {
Neuen Fehler werfen ("Download hat noch nicht begonnen, kann nicht innehalten!");
};
ReadyState.Prototype.fail = function () {
Neuen Fehler werfen ("Die Datei hat noch nicht heruntergeladen, wie kann man sagen, dass sie fehlgeschlagen ist!");
};
ReadyState.Prototype.finish = function () {
Neuen Fehler werfen ("Die Datei hat nicht mit dem Herunterladen begonnen, natürlich kann sie nicht fertig sein!");
};
Diese Funktion nimmt eine Instanz der Download -Wartungsfunktion als Parameter an. Die Download -Funktion wird verwendet, um Statusänderungen und -Anquisitionen zu steuern (ähnlich dem zentralen Controller, der externe Anrufe ermöglicht). ReadyState schreibt die Prototyp -Download -Methode um, um mit dem Herunterladen zu beginnen. Schauen wir uns weiterhin die Hauptfunktionen der Download -Funktion an:
Die Codekopie lautet wie folgt:
var download = function () {
this.ostate = new ReadyState (this);
};
Download.Prototype.setState = function (optate) {
this.ostate = optate;
};
// vier öffentliche Methoden, die für externe Anrufe außen ausgesetzt sind
Download.Prototype.download = function () {
this.ostate.download ();
};
Download.Prototype.pause = function () {
this.ostate.pause ();
};
Download.Prototype.fail = function () {
this.ostate.fail ();
};
Download.prototype.finish = function () {
this.ostate.finish ();
};
// Erhalten Sie verschiedene Zustände und geben Sie in den aktuellen Objekt weiter
Download.Prototype.getreadystate = function () {
Neue ReadyState zurückgeben (dies);
};
Download.Prototype.getDownloadingState = function () {
Neue DownloadingState (this) zurückgeben;
};
Download.Prototype.getDownloadPausedState = function () {
Neue DownloadPausedState (this) zurückgeben;
};
Download.Prototype.getDownloadedState = function () {
Neue DownloadedState (this) zurückgeben;
};
Download.Prototype.getDownloadedFailedState = function () {
Neue DownloadFailedState (this) zurückgeben;
};
Der Prototyp der Download -Funktion enthält 8 Methoden, 4 sind operative Verhaltensweisen für das Herunterladen von Zuständen, und die anderen 4 werden verwendet, um die aktuellen vier verschiedenen Zustände zu erhalten. Diese 4 Methoden erhalten dies alle als Parameter, dh die Download -Instanz selbst als Parameter an das Statusobjekt (ReadyState und die Erbschaftsfunktion, die später implementiert werden soll) übergeben, wodurch das Zustandsobjekt für Odownlaod als bei Bedarf zugänglich macht.
Definieren Sie als nächstes weiterhin 4 verwandte Zustandsfunktionen:
Die Codekopie lautet wie folgt:
var downloadingState = function (odownload) {
State.Apply (dies);
this.odownload = odownload;
};
DownloadingState.Prototype = new State ();
DownloadingState.Prototype.download = function () {
Neuen Fehler werfen ("Die Datei wird bereits heruntergeladen!");
};
DownloadingState.prototype.pause = function () {this.odownload.setState (this.odownload.getDownloadPausedState ());
console.log ("Pause Download!");
};
DownloadingState.prototype.fail = function () {this.odownload.setState (this.odownload.getDownloadedfailedState ());
console.log ("Download fehlgeschlagen!");
};
DownloadingState.Prototype.finish = function () {
this.odownload.setState (this.odownload.getDownloaddState ());
console.log ("heruntergeladen!");
};
Die Hauptsache über das DownloadingState ist, dass die bereits heruntergeladene Datei nicht erneut heruntergeladen werden kann und andere Zustände kontinuierlich ausgeführt werden können.
Die Codekopie lautet wie folgt:
var downloadPausedState = function (odownload) {
State.Apply (dies);
this.odownload = odownload;
};
DownloadPausedState.Prototype = new State ();
DownloadPausedState.Prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
console.log ("Weiter herunterladen!");
};
DownloadPausedState.Prototype.pause = function () {
Werfen Sie einen neuen Fehler ("Es wurde inne, warum müssen Sie noch innehalten!");
};
DownloadPausedState.prototype.fail = function () {this.odownload.setState (this.odownLoad.getDownloadedFailedState ());
console.log ("Download fehlgeschlagen!");
};
DownloadPausedState.Prototype.finish = function () {
this.odownload.setState (this.odownload.getDownloaddState ());
console.log ("heruntergeladen!");
};
In der Funktion DownloadPausedState sollte beachtet werden, dass Downloads, die eine Pause haben, nicht erneut angehalten werden können.
Die Codekopie lautet wie folgt:
var downloadedState = function (odownload) {
State.Apply (dies);
this.odownload = odownload;
};
DownloadedState.Prototype = new State ();
DownloadedState.Prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
console.log ("neu herunterladen!");
};
DownloadedState.Prototype.pause = function () {
Werfen Sie einen neuen Fehler ("Was werden Sie nach dem Herunterladen noch innehalten?");
};
DownloadedState.prototype.fail = function () {
Neuen Fehler werfen ("Der Download war erfolgreich, warum wird es fehlschlagen?");
};
DownloadedState.prototype.finish = function () {
Neuen Fehler werfen ("Der Download ist erfolgreich, Sie können es nicht mehr tun!");
};
DownloadedState-Funktion, in ähnlicher Weise können Sie nach dem erfolgreichen Download nicht mehr feststellen. Sie können den Status neu herunterladen.
Die Codekopie lautet wie folgt:
var downloadFailedState = function (odownload) {
State.Apply (dies);
this.odownload = odownload;
};
DownloadFailedState.Prototype = new State ();
DownloadFailedState.Prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
console.log ("Versuchen Sie, erneut herunterzuladen!");
};
DownloadFailedState.Prototype.pause = function () {
Neuen Fehler werfen ("fehlgeschlagener Download kann nicht durchgeführt werden!");
};
DownloadFailedState.Prototype.fail = function () {
Neuen Fehler werfen ("Es ist alles fehlgeschlagen, warum hat es immer noch gescheitert!");
};
DownloadFailedState.Prototype.finish = function () {
Neuen Fehler werfen ("Fehlgeschlagener Download wird definitiv nicht erfolgreich sein!");
};
In ähnlicher Weise kann der Fehlerstatus der DownloadFailedState -Funktion nicht wieder scheitern, aber Sie können versuchen, sie nach Abschluss erneut herunterzuladen.
Das Aufrufen des Testcode ist sehr einfach. Lassen Sie es uns in HTML demonstrieren. Zuerst benötigen Sie JQuery, und dann gibt es 3 Tasten, die darstellen: Download, Pause und Wiederbelastung. (Beachten Sie, dass Sie Firebug verwenden, um die Ergebnisse in Firefox anzuzeigen, da die Konsole.log -Methode verwendet wird).
Die Codekopie lautet wie folgt:
<html>
<kopf>
<link type = "text/css" rel = "stylesheet" href = "http://www.cnblogs.com/css/style.css"/>
<title> Statusmuster </title>
<script type = "text/javaScript" src = "/jquery.js"> </script>
<script type = "text/javaScript" src = "download.js"> </script>
<script type = "text/javaScript" src = "States/state.js"> </script>
<script type = "text/javaScript" src = "States/downloadFailedState.js"> </script>
<script type = "text/javaScript" src = "States/downloadPausedState.js"> </script>
<script type = "text/javaScript" src = "States/downloadedState.js"> </script>
<script type = "text/javaScript" src = "States/downloadingState.js"> </script>
<script type = "text/javaScript" src = "States/ReadyState.js"> </script>
</head>
<body>
<Eingabe type = "button" value = "starten download" id = "download_button" />
<Eingabe type = "button" value = "pause" id = "pause_button" />
<Eingabe type = "button" value = "download" id = "resume_button" />
<script type = "text/javaScript">
var odownload = neu download ();
$ ("#download_button"). click (function () {
odownload.download ();
});
$ ("#pause_button"). click (function () {
odownload.pause ();
});
$ ("#resume_button"). click (function () {
odownload.download ();
});
</script>
</body>
</html>
Zusammenfassen
Die Nutzungsszenarien des Statusmodus sind ebenfalls besonders klar mit den folgenden zwei Punkten:
1. Das Verhalten eines Objekts hängt von seinem Zustand ab, und es muss sein Verhalten nach seinem Zustand zur Laufzeit ändern.
2. Eine Operation enthält eine große Anzahl von Zweigaussagen, und diese Zweigaussagen hängen vom Status des Objekts ab. Der Staat ist normalerweise eine Darstellung einer oder mehrerer Aufzählungskonstanten.