définition
La combinaison, comme son nom l'indique, fait référence à la création d'une seule entité avec un objet contenant plusieurs composants. Cette seule entité servira de point d'accès à tous ces composants, et bien que cela simplifie considérablement les opérations, elle peut également être assez trompeuse, car il n'y a pas de moyen implicite d'indiquer clairement le nombre de composants que la combinaison contient.
L'objectif du mode combinaison est de découpler le programme client à partir de l'architecture interne des éléments complexes, afin que le programme client traite tous les éléments enfants également.
Chaque nœud enfant peut faire une existence complexe. Pour le nœud parent, il n'est pas nécessaire de connaître la complexité du nœud enfant ou d'implémenter la complexité du nœud enfant. Il n'a qu'à prêter attention aux méthodes spécifiques du nœud enfant, afin que le nœud enfant puisse être utilisé. Simplifie la relation entre le père et le fils.
Il en va de même pour les nœuds enfants. Une exposition excessive à l'interface est parfois un abus, et il réduit également la dépendance à des facteurs externes.
Exemple
Nous ferions mieux d'utiliser une combinaison d'illusion. Dans l'image suivante, vous pouvez voir deux types différents d'objets: les conteneurs et les bibliothèques sont des combinaisons et les images sont des lames. Les combinaisons peuvent transporter des enfants, mais n'effectuent généralement pas plus de comportements. La lame contient la grande majorité des comportements, mais ne peut pas transporter d'enfants, du moins pas dans des exemples de combinaison traditionnels.
Cet exemple crée une bibliothèque d'images comme exemple de modèle combiné. Il n'y a que trois niveaux: album, bibliothèque et image. L'album et la bibliothèque seront combinés, et l'image est la lame, comme indiqué dans l'image ci-dessus. Il s'agit d'une structure plus explicite que la combinaison elle-même ne nécessite, mais pour cet exemple, il est logique de limiter ces niveaux à uniquement des combinaisons ou des lames. La combinaison standard ne limite pas les niveaux structurels qui peuvent avoir des lames, ni limiter le nombre de lames.
Pour commencer, vous devriez d'abord créer une "classe" galerie pour vos albums et bibliothèques. Notez que j'utilise jQuery pour effectuer des opérations DOM pour simplifier le processus.
var gallyComposite = fonction (en-tête, id) {this.children = []; this.element = $ ('<div id = "' + id + '"> </div>') .append ('<h2>' + Heading + '</h2>');} galencomposite.prototype = {add: function (enfant) {this.children.push (enfant); this.element.append (child.getElement ()); }, supprimer: fonction (enfant) {for (var nœud, i = 0; node = this.getchild (i); i ++) {if (node == child) {this.children.splice (i, 1); this.element.detach (child.getElement ()); Retour Vrai; } if (node.remove (enfant)) {return true; }} return false; }, getchild: function (i) {return this.children [i]; }, hide: function () {for (var node, i = 0; node = this.getchild (i); i ++) {node.hide (); } this.element.hide (0); }, show: function () {for (var node, i = 0; node = this.getchild (i); i ++) {node.show (); } this.element.show (0); }, getElement: function () {return this.element; }}Cet emplacement est un peu délicat, puis-je me permettre d'expliquer plus? Nous construisons cette combinaison en utilisant les méthodes ADD, Supprimer et Getchild Getchild. Cet exemple n'utilise pas réellement la suppression et le getchild, mais ils sont très utiles pour créer des combinaisons dynamiques. Les méthodes de peau, d'affichage et de getElement sont utilisées pour manipuler le DOM. Cette combinaison est destinée à être présentée aux utilisateurs d'une page en tant que représentation de la bibliothèque. Cette combinaison peut contrôler ces éléments de la bibliothèque via Hide and Show. Si vous appelez Hide sur l'album, tout l'album disparaîtra, ou si vous pouvez également l'appeler sur une seule image afin que seule cette image disparaisse.
Maintenant, créez une classe GalleryImage. Notez qu'il utilise exactement la même méthode que GalleryComposite. En d'autres termes, ils implémentent la même interface, sauf que l'image est une lame, donc aucune action n'est réellement effectuée sur la méthode liée à l'enfant, comme si elle n'a pas d'enfant. La combinaison doit être exécutée avec la même interface car l'élément de combinaison ne sait pas s'il s'agit d'un autre élément de combinaison ou de la lame qu'il est ajouté par lui-même, donc si vous essayez d'appeler ces méthodes sur ses enfants, vous devez fonctionner complètement bien sans aucune erreur.
var galleryImage = function (src, id) {this.children = []; this.element = $ ('<img />') .attr ('id', id) .attr ('src', src);} galenceImage.prototype = {// en raison de la feuille, il n'utilise pas ces méthodes, // mais doit les implémenter pour compter comme implémentation de l'interface // Hide: function () {this.element.hide (0); }, show: function () {this.element.show (0); }, getElement: function () {return this.element; }}Étant donné que vous avez construit le prototype d'objet, vous pouvez maintenant l'utiliser. D'en bas, vous pouvez voir le code pour construire réellement la bibliothèque d'images.
var contener = new GalleryComposite ('', 'AllGalleries'); var galerie1 = new GalenComposite ('Gallery 1', 'galeries1'); var galerie2 = new GalenComposite ('Gallery 2', 'Gallery2'); var Image1 = New Galemage ('Image1.jpg', 'IMG1'); var image2 = new GalleryMage ('Image2.jpg', '); = new GalleryImage ('Image3.jpg', 'img3'); var image4 = new GalenImage ('Image4.jpg', 'img4'); galerie1.add (Image1); galerie1.add (image2); galerie2.add (image3); Galence2.Add (image4); Container.Add (galerie 1); Conteneur.Addd (Galence2); // Adposez to the Top Container. corps, // sinon il ne se présentera jamaisLes avantages du mode combinaison:
Des opérations simples peuvent également produire des résultats complexes. Il vous suffit d'effectuer des opérations sur l'objet de niveau supérieur et de laisser chaque objet enfant passer par lui-même. Ceci est particulièrement utile pour les opérations qui sont répétées.
En mode combinaison, le couplage entre les objets individuels est très lâche. Tant qu'ils implémentent la même interface, ce n'est qu'un peu d'aide pour changer leurs positions ou les échanger. Il favorise la réutilisation du code et est également propice à la reconstruction du code.
Chaque fois qu'une opération est effectuée sur un objet combiné de niveau supérieur, il s'agit en fait d'une recherche profonde profonde de toute la structure pour trouver des nœuds, et le programmeur qui a créé l'objet combiné ignore ces détails. Il est très facile d'ajouter, de supprimer et de trouver des nœuds dans cette hiérarchie.
Inconvénients du mode combinaison:
La facilité d'utilisation d'un objet combiné peut masquer le coût de chaque opération qu'il prend en charge. Car toute opération appelée par un objet combiné sera transmise à tous ses sous-objets. Si cette hiérarchie est grande, les performances du système seront affectées. Le fonctionnement normal du mode combinaison nécessite une forme d'interface.
Lors de la combinaison d'objets et de classes de nœuds est utilisée comme outils d'enveloppe pour les éléments HTML, les objets combinés doivent se conformer aux règles d'utilisation HTML. Par exemple, une table est difficile à convertir en un objet combiné.
Plus l'inspection de l'interface est stricte, plus la classe d'objets combinée sera fiable.