einführen
Der Flygewichtsmodus (Flygewicht) führt die Freigabetechnologie aus, um eine große Anzahl feinkörniger Objekte effektiv zu unterstützen, wodurch der Aufwand einer großen Anzahl kleiner Klassen mit demselben Inhalt (z. B. Speicherkonsum) und jedem ermöglicht wird, eine Klasse zu teilen (MetaClass).
Das Enzyklopädie -Muster kann eine große Menge an Overhead von sehr ähnlichen Klassen vermeiden. Bei der Programmierung ist es manchmal notwendig, eine große Anzahl feinkörniger Klasseninstanzen zu erstellen, um Daten darzustellen. Wenn Sie feststellen, dass diese Instanzen im Grunde genommen den gleichen Overhead aufweisen, mit Ausnahme einiger Parameter, können Sie die Anzahl der Klassen, die instanziiert werden müssen, erheblich reduzieren. Wenn diese Parameter außerhalb der Klasseninstanz verschoben werden können und sie angeben, wenn die Methode aufgerufen wird, kann die Anzahl der einzelnen Instanzen durch Freigabe stark reduziert werden.
Was ist, wenn Sie den Enzyklopädie -Modus in JavaScript anwenden? Es gibt zwei Möglichkeiten. Die erste besteht darin, sie auf die Datenschicht anzuwenden, hauptsächlich auf eine große Anzahl ähnlicher Objekte im Speicher. Die zweite besteht darin, sie auf die DOM -Schicht anzuwenden, die im zentralen Ereignismanager verwendet werden kann, um das Hinzufügen von Ereignisverhandlungen zu jedem untergeordneten Element im übergeordneten Container zu vermeiden.
Genießen Sie die Datenschicht
Es gibt zwei wichtige Konzepte im Fliegengewicht - interner Zustand intrinsisch und externer Zustand extrinsisch. Der interne Zustand wird durch interne Methoden im Objekt verwaltet, und externe Informationen können extern gelöscht oder gespeichert werden.
Um es unverblümt auszudrücken, soll zuerst ein Originalmodell eingeklemmt werden und dann bestimmte Modelle mit unterschiedlichen Eigenschaften gemäß verschiedenen Anlässen und Umgebungen erzeugt werden. Offensichtlich müssen hier verschiedene neue Objekte generiert werden, sodass der Werksmodus häufig im Fliegengewichtsmodus angezeigt wird. Der interne Fliegengewicht wird verwendet, um zu teilen. Die Flyweight Factory ist für die Aufrechterhaltung eines Flygewichts -Pools (Moduspool) verantwortlich, um Objekte mit internem Zustand zu speichern.
Verwenden Sie den Genussmodus
Lassen Sie uns demonstrieren, dass die Metadaten jedes Buches, wenn das System eine Klassenbibliothek verwendet, um alle Bücher zu verwalten, vorläufig auf den folgenden Inhalt festgelegt wird:
Die Codekopie lautet wie folgt:
AUSWEIS
Titel
Autor
Genre
Seitenzahl
Publisher ID
ISBN
Wir müssen auch die Zeit und den Kreditnehmer jedes Buches sowie das Datum der Rückgabe und das verfügbare Ergebnis definieren:
Die Codekopie lautet wie folgt:
Checkoutdate
Kasse
Duereturndate
Verfügbarkeit
Da das Buchobjekt auf den folgenden Code eingestellt ist, beachten Sie bitte, dass der Code noch nicht optimiert wurde:
Die Codekopie lautet wie folgt:
var book = function (ID, Titel, Autor, Genre, PageCount, Publisherid, ISBN, Checkoutdate, CheckoutMember, DuereturnDate, Verfügbarkeit) {
this.id = id;
this.title = title;
this.author = Autor;
this.genre = Genre;
this.pageCount = pageCount;
this.publisherid = publisherId;
this.isbn = isbn;
this.Checkoutdate = checkoutdate;
this.CheckoutMember = CheckoutMember;
this.duereturnDate = duereturndate;
this.Availability = Verfügbarkeit;
};
Book.prototype = {
Gettitle: function () {
kehre diesen.titel zurück;
},
getAuthor: function () {
kehre diesen.autor zurück;
},
getisbn: function () {
kehre dies zurück.isbn;
},
/*Andere GET -Methoden werden hier nicht angezeigt*/
// Aktualisieren Sie den Kreditvergabestatus
updatecheckoutStatus: function (bookId, newstatus, checkoutdate, checkoutMember, NewReturndate) {
this.id = bookId;
this.Availability = newStatus;
this.Checkoutdate = checkoutdate;
this.CheckoutMember = CheckoutMember;
this.duerEnturndate = newReturndate;
},
//erneuern
ExtendCheckoutPeriod: Funktion (bookId, newReturndate) {
this.id = bookId;
this.duerEnturndate = newReturndate;
},
// Ist es abgelaufen
ispastdue: function (bookId) {
var currentDate = new Date ();
currentDate.getTime ()> Date.Parse (this.DuerTurnDate) zurückgeben;
}
};
Das Programm mag zu Beginn in Ordnung sein, aber im Laufe der Zeit können Bücher in großen Mengen zunehmen, und jede Art von Buch hat unterschiedliche Versionen und Mengen. Sie werden feststellen, dass das System immer langsamer und langsamer wird. Tausende von Buchobjekten können im Speicher vorgestellt werden, und wir müssen den Enzyklopädie -Modus zur Optimierung verwenden.
Wir können die Daten in zwei Arten interner und externer Daten unterteilen. Die Daten zu Buchobjekten (Titel, Autor usw.) können auf interne Eigenschaften zugeordnet werden, während (CheckoutMember, DuereturnDate usw.) externen Eigenschaften zugeordnet werden können. Auf diese Weise kann der folgende Code dasselbe Objekt im selben Buch teilen, denn egal wer das Buch leiht, solange das Buch dasselbe Buch ist, sind die grundlegenden Informationen dieselben:
Die Codekopie lautet wie folgt:
/*Xienyuan -Modus -Optimierungscode*/
var book = function (Titel, Autor, Genre, PageCount, Publisherid, ISBN) {
this.title = title;
this.author = Autor;
this.genre = Genre;
this.pageCount = pageCount;
this.publisherid = publisherId;
this.isbn = isbn;
};
Definieren der Basisfabrik
Lassen Sie uns eine grundlegende Fabrik definieren, um zu überprüfen, ob das Objekt des Buches zuvor erstellt wurde, kehren Sie zurück, wenn es vorhanden ist, und erstellen und speichern es, damit es später weiterhin zugreifen kann, was sicherstellt, dass wir nur ein Objekt für jedes Buch erstellen:
Die Codekopie lautet wie folgt:
/* Buchfabrik Singleton*//
var bookFactory = (function () {
var existierbücher = {};
zurückkehren{
CreateBook: Funktion (Titel, Autor, Genre, PageCount, Publisherid, ISBN) {
/*Suchen Sie, ob vor*/erstellt werden soll
var existentbook = vorhandenbücher [ISBN];
if (vorhandenbuch) {
bestehendes Buch zurückgeben;
}anders{
/ * Wenn nicht, erstellen Sie einen und speichern */
var book = New Book (Titel, Autor, Genre, PageCount, Publisherid, ISBN);
vorhandene Bücher [ISBN] = Buch;
Rückbuch;
}
}
}
});
Verwalten Sie den externen Status
Der externe Zustand ist relativ einfach. Mit Ausnahme des Buches, das wir verkapselt haben, muss hier alles andere verwaltet werden:
Die Codekopie lautet wie folgt:
/*BookRecordManager Singleton zum Ausleihenmanagement*/
var bookRecordManager = (function () {
var bookRecordDatabase = {};
zurückkehren{
/*Fügen Sie einen Buchausleihendatensatz hinzu*/
AddbookRecord: Funktion (ID, Titel, Autor, Genre, PageCount, Publisherid, ISBN, Checkoutdate, CheckoutMember, Duereturndate, Verfügbarkeit) {
var book = bookFactory.createbebook (Titel, Autor, Genre, PageCount, Publisherid, ISBN);
bookRecordDatabase [id] = {
CheckoutMember: CheckoutMember,
checkoutdate: checkoutdate,
Duereturndate: Duereturndate,
Verfügbarkeit: Verfügbarkeit,
Buch: Buch;
};
},
updatecheckoutStatus: function (bookId, newstatus, checkoutdate, checkoutMember, NewReturndate) {
var record = bookRecordDatabase [bookID];
record.Availability = newStatus;
record.Checkoutdate = checkoutdate;
record.CheckoutMember = checkoutMember;
record.duerEnturndate = newReturndate;
},
ExtendCheckoutPeriod: Funktion (bookId, newReturndate) {
bookRecordDatabase [bookId] .DuerTurnDate = NewReturnDate;
},
ispastdue: function (bookId) {
var currentDate = new Date ();
currentDate.getTime ()> Date.Parse (bookRecordDatabase [bookId] .DuerTurnDate) zurückgeben;
}
};
});
Auf diese Weise haben wir dieselben Informationen des gleichen Buches in einem Buchmanager -Objekt gespeichert und nur eine Kopie gespeichert. Im Vergleich zum vorherigen Code können wir feststellen, dass er viel Speicher spart.
Genießen Sie den Yuan -Modus und Dom
Ich werde hier nicht viel über den DOM -Vorfall sagen. Ich glaube, jeder weiß es schon. Lassen Sie uns zwei Beispiele geben.
Beispiel 1: Zentrales Eventmanagement
Wenn wir beispielsweise sein Klickereignis für viele ähnliche Elemente oder Strukturen (z. B. Menüs oder mehrere LIs in UL) überwachen müssen, müssen wir für jedes Element Ereignisse binden. Wenn es sehr, sehr viele Elemente gibt, kann sich die Leistung vorstellen. In Kombination mit der Kenntnis von Blasen sprudelt das Ereignis, wenn ein untergeordnetes Element ausgelöst wird, nach Auslöser des Auslösers zum vorherigen Element. Mit dieser Funktion können wir den Enzyklopädie -Modus verwenden. Wir können Ereignisereignisse auf den übergeordneten Elementen dieser ähnlichen Elemente überwachen und dann beurteilen, welches untergeordnete Element ein Ereignis ausgelöst hat, und dann weitere Vorgänge ausführen.
Hier kombinieren wir die Bind-/Unbind -Methode von JQuery, um ein Beispiel zu geben.
HTML:
Die Codekopie lautet wie folgt:
<div id = "Container">
<div href = "#"> Weitere Informationen (Adresse)
<spann>
Hier finden Sie weitere Informationen
</span> </div>
<div href = "#"> Weitere Informationen (Karte)
<spann>
<iframe src = "http://www.map-generator.net/extmap.php?name=london&address=london%2c%20england&width=500...gt;" </iframe>
</span>
</div>
</div>
JavaScript:
Die Codekopie lautet wie folgt:
statemanager = {
fly: function () {
var self = this;
$ ('#Container'). UnBind (). Bind ("Click", Funktion (e) {
var target = $ (e.origalTarget || e.srcelement);
// Bestimmen Sie, welches untergeordnete Element es ist
if (target.is ("div.toggle")) {
self.handleclick (Ziel);
}
});
},
Handleclick: Funktion (Elem) {
Elem.find ('span'). Toggle ('langsam');
}
});
Beispiel 2: Anwenden des Enzyklopädie -Modus zur Verbesserung der Leistung
Ein weiteres Beispiel hängt immer noch mit JQuery zusammen. Im Allgemeinen verwenden wir Elementobjekte in der Ereignisrückruffunktion. Wir verwenden oft die Form von $ (this). Tatsächlich erstellt es wiederholt ein neues Objekt, da dies in der Rückruffunktion bereits das DOM -Element selbst ist. Wir müssen den folgenden Code verwenden:
Die Codekopie lautet wie folgt:
$ ('div'). Bind ('klick', function () {
console.log ('Sie haben geklickt:' + $ (this) .attr ('id'));
});
// Der obige Code sollte vermieden werden und vermeiden, JQuery -Objekte im DOM -Element erneut zu generieren, da Sie das DOM -Element selbst direkt verwenden können.
$ ('div'). Bind ('klick', function () {
console.log ('Sie haben geklickt:' + this.id);
});
Wenn wir die Form von $ (this) verwenden müssen, können wir auch unsere eigene Version des einzelnen Instanzmusters implementieren, z.
Die Codekopie lautet wie folgt:
JQuery.Single = (Funktion (o) {
var collection = jQuery ([1]);
Rückgabefunktion (Element) {
// Elemente in die Sammlung aufnehmen
Sammlung [0] = Element;
// kehre zur Sammlung zurück
Rücklaufsammlung;
};
});
Wie man verwendet:
Die Codekopie lautet wie folgt:
$ ('div'). Bind ('klick', function () {
var html = jQuery.Single (this) .Next (). html ();
console.log (html);
});
Auf diese Weise wird das DOM -Element selbst so zurückgegeben, wie es ist, und das JQuery -Objekt wird nicht erstellt.
Zusammenfassen
Der Flygewichtsmodus ist ein Modus, der die Programmeffizienz und -leistung verbessert, die die Laufgeschwindigkeit des Programms erheblich beschleunigt. Es gibt viele Anwendungsszenarien: Wenn Sie beispielsweise eine Reihe von Zeichenfolgen aus einer Datenbank lesen möchten, werden viele dieser Saiten wiederholt, dann können wir diese Zeichenfolgen im Fliegengewichtspool (Pool) speichern.
Wenn eine Anwendung eine große Anzahl von Objekten verwendet und diese große Anzahl von Objekten einen hervorragenden Speicher verursachen, sollten Sie den Enzyklopädie -Modus verwenden. und die meisten Objektzustände können extern sein. Wenn der externe Zustand des Objekts gelöscht wird, können viele Gruppen von Objekten durch relativ wenige gemeinsam genutzte Objekte ersetzt werden. Zu diesem Zeitpunkt können Sie in Betracht ziehen, den Enzyklopädie -Modus zu verwenden.