definición
La combinación, como su nombre lo indica, se refiere a crear una sola entidad con un objeto que contiene múltiples componentes. Esta entidad única servirá como punto de acceso para todos estos componentes, y aunque esto simplifica enormemente las operaciones, también puede ser bastante engañoso, ya que no hay una forma implícita de indicar claramente cuántos componentes contiene la combinación.
El objetivo del modo de combinación es desacoplar el programa del cliente de la arquitectura interna de elementos complejos, de modo que el programa del cliente trata todos los elementos infantiles por igual.
Cada nodo infantil puede hacer una existencia compleja. Para el nodo principal, no es necesario conocer la complejidad del nodo infantil o implementar la complejidad del nodo infantil. Solo necesita prestar atención a los métodos específicos del nodo infantil, para que se pueda usar el nodo secundario. Simplifica la relación entre el padre y el hijo.
Lo mismo es cierto para los nodos infantiles. La exposición excesiva a la interfaz es a veces un abuso, y también reduce la dependencia de los factores externos.
Ejemplo
Será mejor que usemos una combinación de ilusión. En la siguiente imagen, puede ver dos tipos diferentes de objetos: los contenedores y las bibliotecas son combinaciones y las imágenes son cuchillas. Las combinaciones pueden transportar niños, pero generalmente no realizan más comportamientos. La cuchilla contiene la gran mayoría de los comportamientos, pero no puede transportar niños, al menos no en ejemplos de combinación tradicionales.
Este ejemplo crea una biblioteca de imágenes como un ejemplo de patrón de combinación. Solo hay tres niveles: álbum, biblioteca e imagen. El álbum y la biblioteca se combinarán, y la imagen es la cuchilla, como se muestra en la imagen de arriba. Esta es una estructura más explícita de la que requiere la combinación en sí, pero para este ejemplo tiene sentido limitar estos niveles a solo combinaciones o cuchillas. La combinación estándar no limita qué niveles estructurales pueden tener cuchillas, ni limita el número de cuchillas.
Para comenzar, primero debe crear una "clase" de GalleryComposite para sus álbumes y bibliotecas. Tenga en cuenta que estoy usando jQuery para realizar operaciones DOM para simplificar el proceso.
var galeryComposse = function (encabezado, id) {this.children = []; this.element = $ ('<div id = "' + id + '"> </div>') .append ('<h2>' + encabezado + '</h2>');} galeryComposs.prototype = {add: function (child) {this.children.push (child); this.element.append (child.getElement ()); }, eliminar: function (child) {for (var nodo, i = 0; node = this.getChild (i); i ++) {if (node == child) {this.children.splice (i, 1); this.element.detach (child.getElement ()); devolver verdadero; } if (node.remove (child)) {return true; }} return false; }, getChild: function (i) {return this.children [i]; }, ocultar: function () {for (var nodo, i = 0; nodo = this.getChild (i); i ++) {node.hide (); } this.element.phide (0); }, show: function () {for (var nodo, i = 0; nodo = this.getChild (i); i ++) {node.show (); } this.element.show (0); }, getElement: function () {return this.element; }}Esta ubicación es un poco complicada, ¿puedo permitirme explicar más? Construimos esta combinación utilizando los métodos ADD, Eliminar y GetChild GetChild. Este ejemplo en realidad no usa Remout and GetChild, pero son muy útiles para crear combinaciones dinámicas. Los métodos de ocultación, show y getElement se utilizan para manipular el DOM. Esta combinación está destinada a presentarse a los usuarios en una página como una representación de la biblioteca. Esta combinación puede controlar estos elementos de la biblioteca a través de Hide and Show. Si llamas a Hide en el álbum, todo el álbum desaparecerá, o también puedes llamarlo en una sola imagen para que solo esa imagen desaparezca.
Ahora, cree una clase de GalleryImage. Tenga en cuenta que usa exactamente el mismo método que GalleryComposite. En otras palabras, implementan la misma interfaz, excepto que la imagen es una cuchilla, por lo que no se realiza ninguna acción en el método relacionado con el niño, como si no tuviera ningún hijo. La combinación debe ejecutarse con la misma interfaz porque el elemento de combinación no sabe si es otro elemento de combinación o cuchilla que se agrega por sí misma, por lo que si intenta llamar a estos métodos a sus hijos, debe funcionar completamente bien sin ningún error.
var galeryImage = function (src, id) {this.children = []; this.element = $ ('<img />') .attr ('id', id) .attr ('src', src);} galeryImage.prototype = {// debido a que es una hoja, no utiliza estos métodos, // pero debe implementarlos para contar como implementando la interfaz de // compuesto add: function () {}, eliminar: function () {}, obtenerlos para contar como implementando la interfaz de // compuesto add: function () {}, eliminar: function () {{}, obtenerlos para contar como implementando la interfaz de // compuesto add: function () {}, eliminar: function () {{}, obtenerlos para contar como implementando la interfaz de // compuesto add: function () {}, eliminar: function () {{}, obtenerlos para contar como implementando la interfaz de interfaz () }, ocultar: function () {this.element.hide (0); }, show: function () {this.element.show (0); }, getElement: function () {return this.element; }}Dado que ha creado el prototipo de objeto, ahora puede usarlo. Desde abajo puede ver el código para construir la biblioteca de imágenes.
var container = new GalleryComposite('', 'allgalleries');var gallery1 = new GalleryComposite('Gallery 1', 'galleries1');var gallery2 = new GalleryComposite('Gallery 2', 'gallery2');var image1 = new GalleryImage('image1.jpg', 'img1');var image2 = new GalleryImage('image2.jpg', 'IMG2'); var Image3 = New GalleryImage ('Image3.jpg', 'IMG3'); var Image4 = New GalleryImage ('Image4.jpg', 'img4'); Gallery1.add (Image1); Gallery1.add (Image2); Gallery2.Add (Image3); Gallery2.Add (Image4); Container.add (Gallery1); Container.add (Gallery2); // Asegúrese de agregar el contenedor superior al cuerpo, // de lo contrario nunca se mostrará UP.Container.getElement (). AppendTo ('Body'); Container.show ();Los beneficios del modo combinación:
Las operaciones simples también pueden producir resultados complejos. Solo necesita realizar operaciones en el objeto de nivel superior y dejar que cada objeto infantil pase esta operación por su cuenta. Esto es especialmente útil para aquellas operaciones que se repiten.
En modo combinado, el acoplamiento entre los objetos individuales es muy flojo. Mientras implementen la misma interfaz, solo es un poco de ayuda cambiar sus posiciones o intercambiarlas. Promueve la reutilización del código y también es propicio para la reconstrucción del código.
Cada vez que se realiza una operación en un objeto combinado de nivel superior, en realidad es una búsqueda profunda de toda la estructura para encontrar nodos, y el programador que creó el objeto combinado ignora estos detalles. Es muy fácil de agregar, eliminar y encontrar nodos en esta jerarquía.
Desventajas del modo combinado:
La facilidad de uso de un objeto combinado puede enmascarar el costo de cada operación que admite. Dado que cualquier operación llamada por un objeto combinado se pasará a todos sus subobjetos. Si esta jerarquía es grande, el rendimiento del sistema se verá afectado. El funcionamiento normal del modo de combinación requiere alguna forma de interfaz.
Al combinar objetos y clases de nodos se utilizan como herramientas de envoltura para elementos HTML, los objetos combinados deben cumplir con las reglas de uso de HTML. Por ejemplo, una tabla es difícil de convertir en un objeto combinado.
Cuanto más estricta sea la inspección de la interfaz, más confiable será la clase de objeto combinado.