Definition
Die Kombination bezieht sich, wie der Name schon sagt, auf das Erstellen einer einzelnen Entität mit einem Objekt, das mehrere Komponenten enthält. Diese einzelne Entität dient als Zugangspunkt für all diese Komponenten, und obwohl dies die Operationen stark vereinfacht, kann sie auch ziemlich irreführend sein, da es keinen impliziten Weg gibt, klar anzugeben, wie viele Komponenten die Kombination enthält.
Ziel des Kombinationsmodus ist es, das Kundenprogramm aus der internen Architektur komplexer Elemente zu entkoppeln, damit das Kundenprogramm alle Kinderelemente gleich behandelt.
Jeder untergeordnete Knoten kann komplexe Existenz machen. Für den übergeordneten Knoten ist es nicht erforderlich, die Komplexität des Kinderknotens zu kennen oder die Komplexität des untergeordneten Knotens zu implementieren. Es muss nur auf die spezifischen Methoden des Kinderknotens achten, damit der Kinderknoten verwendet werden kann. Vereinfacht die Beziehung zwischen dem Vater und dem Sohn.
Gleiches gilt für Kinderknoten. Eine übermäßige Exposition der Schnittstelle ist manchmal ein Missbrauch und verringert auch die Abhängigkeit von externen Faktoren.
Beispiel
Wir sollten eine Illusionskombination besser verwenden. Im folgenden Bild sehen Sie zwei verschiedene Arten von Objekten: Container und Bibliotheken sind Kombinationen und Bilder sind Klingen. Kombinationen können Kinder tragen, führen jedoch im Allgemeinen nicht mehr Verhaltensweisen durch. Die Klinge enthält die überwiegende Mehrheit der Verhaltensweisen, kann jedoch keine Kinder tragen, zumindest nicht in traditionellen Kombinationsbeispielen.
In diesem Beispiel wird eine Bildbibliothek als Beispiel für Kombinationsmuster erstellt. Es gibt nur drei Ebenen: Album, Bibliothek und Bild. Das Album und die Bibliothek werden kombiniert und das Bild ist die Klinge, wie im obigen Bild gezeigt. Dies ist eine explizitere Struktur als die Kombination selbst erfordert, aber für dieses Beispiel ist es sinnvoll, diese Ebenen nur auf Kombinationen oder Klingen zu beschränken. Die Standardkombination begrenzt weder, welche Strukturwerte Klingen haben können, noch begrenzt sie die Anzahl der Klingen.
Zu Beginn sollten Sie zunächst eine Galeriecomposit -Klasse für Ihre Alben und Bibliotheken erstellen. Beachten Sie, dass ich JQuery verwendet, um DOM -Operationen auszuführen, um den Prozess zu vereinfachen.
var gal GalleryComposite = Funktion (Überschrift, id) {this.children = []; this.element = $ ('<div id = "' + id + '"> </div>') .Append ('<H2>' + Überschrift + '</h2>');} galerieComposite.Prototype = {add: function (child) {this.children.push (child); this.element.Append (Child.getElement ()); }, entfernen: function (mind) {for (var node, i = 0; node = this.getCild (i); i ++) {if (node == child) {this.children.splice (i, 1); this.element.detach (child.getElement ()); zurückkehren; } if (node.remove (minder)) {return true; }} return false; }, getChild: function (i) {return this.children [i]; }, ausblenden: function () {for (var node, i = 0; node = this.getCild (i); i ++) {node.hide (); } this.element.hide (0); }, anzeigen: function () {for (var node, i = 0; node = this.getCild (i); i ++) {node.show (); } this.element.show (0); }, getElement: function () {return this.element; }}Dieser Ort ist etwas schwierig. Kann ich mir erlauben, mehr zu erklären? Wir erstellen diese Kombination mit den Methoden hinzufügen, entfernen und getChild getChild. In diesem Beispiel wird nicht entfernen und getChild verwendet, aber sie sind sehr nützlich, um dynamische Kombinationen zu erstellen. Die Methoden für Versteck-, Zeigen- und GetElement -Methoden werden verwendet, um das DOM zu manipulieren. Diese Kombination soll Benutzern auf einer Seite als Darstellung der Bibliothek präsentiert werden. Diese Kombination kann diese Bibliothekselemente durch Versteck und Show steuern. Wenn Sie Hide auf dem Album anrufen, wird das gesamte Album verschwinden, oder Sie können es auch auf einem einzigen Bild aufrufen, damit nur dieses Bild verschwindet.
Erstellen Sie nun eine GalerieImage -Klasse. Beachten Sie, dass genau die gleiche Methode wie Galeriecomposite verwendet wird. Mit anderen Worten, sie implementieren dieselbe Schnittstelle, außer dass das Bild eine Klinge ist, sodass tatsächlich keine Aktion auf die untergeordnete Methode durchgeführt wird, so wie es kein Kind hat. Die Kombination muss mit derselben Schnittstelle ausgeführt werden, da das Kombinationselement nicht weiß, ob es sich um ein anderes Kombinationselement oder eine andere Klinge handelt, die von selbst hinzugefügt wird. Wenn Sie also versuchen, diese Methoden für ihre Kinder aufzurufen, müssen Sie ohne Fehler völlig gut laufen.
var gal GalleryImage = function (src, id) {this.children = []; this.element = $('<img />') .attr('id', id) .attr('src', src);}GalleryImage.prototype = { // Due to this being a leaf, it doesn't use these methods, // but must implement them to count as implementing the // Composite interface add: function () { }, remove: function () { }, getChild: function () { }, ausblenden: function () {this.element.hide (0); }, anzeigen: function () {this.element.show (0); }, getElement: function () {return this.element; }}Da Sie den Objektprototyp erstellt haben, können Sie ihn jetzt verwenden. Von unten sehen Sie den Code zum Erstellen der Bildbibliothek.
var container = new GalleryComposite ('', 'AllGalleries'); var galerie1 = new GalleryComposite ('Galerie 1', 'Galeries1'); var galerie2 = new GalleryComposite ('Galerie 2', 'Galerie2'); var image1 = new Galerieimage ('Image1.jpg', IMG1 '). = new GalleryImage ('Image3.jpg', 'img3'); var image4 = new GalleryImage ('image4.jpg', 'img4'); Galerie1.Add (Image1); Galerie1.Add (Image2); Galerie2.Add (Bild3); Galerie2.Add (Bild4); Container. Body, // sonst wird es nie angezeigt.Die Vorteile des Kombinationsmodus:
Einfache Operationen können auch komplexe Ergebnisse erzielen. Sie müssen nur Operationen auf dem obersten Objekt ausführen und jedes untergeordnete Objekt diese Operation selbst übergeben. Dies ist besonders nützlich für die Operationen, die wiederholt werden.
Im Kombinationsmodus ist die Kopplung zwischen den einzelnen Objekten sehr locker. Solange sie dieselbe Schnittstelle implementieren, ist es nur ein wenig Hilfe, ihre Positionen zu ändern oder sie auszutauschen. Es fördert die Wiederverwendung von Code und ist auch der Code -Rekonstruktion förderlich.
Immer wenn eine Operation auf einem kombinierten Objekt auf oberster Ebene durchgeführt wird, ist es tatsächlich eine tiefste Suche nach der gesamten Struktur, um Knoten zu finden, und der Programmierer, der das kombinierte Objekt erstellt hat, kennt diese Details nicht. Es ist sehr einfach, Knoten in dieser Hierarchie hinzuzufügen, zu löschen und zu finden.
Nachteile des Kombinationsmodus:
Die Benutzerfreundlichkeit eines kombinierten Objekts kann die Kosten für jeden von ihm unterstützten Betrieb maskieren. Da eine von einem kombinierte Objekt bezeichnete Operation an alle Sub-Objekte übergeben wird. Wenn diese Hierarchie groß ist, wird die Leistung des Systems betroffen. Der normale Betrieb des Kombinationsmodus erfordert eine Form der Schnittstelle.
Bei Kombination von Objekten und Knotenklassen werden kombinierte Objekte als Wraping -Tools für HTML -Elemente verwendet. Beispielsweise ist eine Tabelle schwer in ein kombiniertes Objekt umzuwandeln.
Je strenger die Schnittstellenprüfung ist, desto zuverlässiger ist die kombinierte Objektklasse.