Patrones compuestos de Javascript

modo de combinación

Introducción

El modo compuesto compone objetos en una estructura de árbol para representar una jerarquía de "parte-todo". Además de usarse para representar la estructura de árbol, otro beneficio del modo compuesto es que a través de la representación polimórfica del objeto, el usuario tiene consistencia en el uso de un solo objeto y un objeto compuesto.

El proceso de solicitud pasando en el árbol.

En el patrón compuesto, el proceso de solicitud que pasa en el árbol siempre sigue una lógica.

Tomando un comando macro como ejemplo, la solicitud se transmite desde el objeto en la parte superior del árbol. Si el objeto que actualmente procesa la solicitud es un objeto hoja (subcomando ordinario), el objeto hoja mismo procesará la solicitud en consecuencia; si el objeto que actualmente procesa la solicitud es un objeto combinado (comando macro), el objeto combinado atravesará sus subnodos y pasará la solicitud a estos subnodos.

En resumen, si el nodo secundario es un objeto hoja, el mismo objeto hoja manejará la solicitud, y si el nodo secundario sigue siendo un objeto compuesto, la solicitud continuará transmitiéndose. No habrá otros nodos secundarios debajo del objeto hoja. Un objeto hoja es el final de la rama del árbol. Puede haber nodos secundarios debajo del objeto compuesto. Las solicitudes se pasan a lo largo del árbol de arriba a abajo hasta el final
inserte la descripción de la imagen aquí
del árbol. Como cliente, solo debe preocuparse por el objeto compuesto en la parte superior del árbol. El cliente solo necesita solicitar este objeto compuesto, y la solicitud se pasará por el árbol para llegar a todos los objetos hoja a su vez.

Ejemplo de modo de combinación - Escaneo de carpetas

La relación entre carpetas y archivos es muy adecuada para ser descrita por el modo de combinación. Una carpeta puede contener tanto archivos como otras carpetas, y eventualmente puede combinarse en un árbol.El modo de combinación tiene las siguientes dos ventajas en la aplicación de carpetas.

Por ejemplo, encontré algunos libros electrónicos en el disco duro móvil de mi colega y quiero copiarlos en la carpeta de materiales de aprendizaje en la unidad F. Al copiar estos libros electrónicos, no necesito considerar el tipo de archivos, ya sean libros electrónicos individuales o en carpetas. El modo de combinación hace que Ctrl+V y Ctrl+C sean una operación unificada.

Cuando escaneo esta carpeta con un software antivirus, a menudo no me importa cuántos archivos y subcarpetas hay en ella. El modo combinado nos permite operar solo la carpeta más externa para escanear.

Cuando escaneo esta carpeta con un software antivirus, a menudo no me importa cuántos archivos y subcarpetas hay en ella. El modo combinado nos permite operar solo la carpeta más externa para escanear.

        /******************************* Folder ******************************/
        var Folder = function( name ){
    
    
            this.name = name;
            this.files = [];
        };

        Folder.prototype.add = function( file ){
    
    
            this.files.push( file );
        };

        Folder.prototype.scan = function(){
    
    
            console.log( ’开始扫描文件夹: ' + this.name );
            for ( var i = 0, file, files = this.files; file = files[ i++ ]; ){
    
    
              file.scan();
            }
        };

        /******************************* File ******************************/
        var File = function( name ){
    
    
            this.name = name;
        };

        File.prototype.add = function(){
    
    
            throw new Error( ’文件下面不能再添加文件’ );
        };
        File.prototype.scan = function(){
    
    
            console.log( ’开始扫描文件: ' + this.name );
        };

A continuación, cree algunas carpetas y objetos de archivo, y combínelos en un árbol, que es la estructura de directorios de archivos existente en nuestra unidad F:

        var folder = new Folder( ’学习资料’ );
        var folder1 = new Folder( 'JavaScript' );
        var folder2 = new Folder ( 'jQuery' );

        var file1 = new File( 'JavaScript设计模式与开发实践’ );
        var file2 = new File( ’精通jQuery' );
        var file3 = new File( ’重构与模式’ )

        folder1.add( file1 );
        folder2.add( file2 );

        folder.add( folder1 );
        folder.add( folder2 );
        folder.add( file3 );

El requisito actual es copiar todos los archivos y carpetas del disco duro móvil a este árbol, suponiendo que hayamos obtenido estos objetos de archivo:

        var folder3 = new Folder( 'Nodejs' );
        var file4 = new File( ’深入浅出Node.js' );
        folder3.add( file4 );

        var file5 = new File( 'JavaScript语言精髓与编程实践’ );

El siguiente paso es agregar estos archivos al árbol original:

        folder.add( folder3 );
        folder.add( file5 );

Cambiamos la estructura de árbol y agregamos nuevos datos sin modificar nada del código original, lo cual está en línea con el principio abierto-cerrado. Después de usar el modo de combinación, la operación de escanear toda la carpeta también es pan comido, solo necesitamos operar el objeto más alto del árbol

        folder.scan();

El resultado de la ejecución se muestra en la figura.
inserte la descripción de la imagen aquí

algunos lugares notables

1. El modo compuesto no es una relación padre-hijo

La estructura de árbol del modo compuesto hace que la gente piense erróneamente que el objeto compuesto y el objeto hoja son relaciones padre-hijo, lo cual es incorrecto.

El modo compuesto es una relación HAS-A (agregación), no IS-A. Un objeto compuesto contiene un conjunto de objetos hoja, pero Hoja no es una subclase de Compuesto. El objeto compuesto delega solicitudes a todos los objetos hoja que contiene, y la clave de su cooperación es tener la misma interfaz.

Para facilitar la descripción, este capítulo a veces se refiere a los objetos superior e inferior como nodos padre-hijo, pero debe saber que no son la relación padre-hijo real.

Consistencia de operaciones en objetos hoja

Además de requerir que el objeto combinación y el objeto hoja tengan la misma interfaz, el modo combinación también tiene una condición necesaria, es decir, las operaciones en un grupo de objetos hoja deben ser consistentes.

Por ejemplo, la empresa quiere distribuir 1000 yuanes a todos los empleados para el feriado del Día de Año Nuevo. Este escenario puede usar el modo combinado, pero si la empresa envía un correo electrónico con felicitaciones de cumpleaños a los empleados que celebran su cumpleaños hoy, el modo combinado es inútil aquí, a menos que primero seleccione los empleados cuyo cumpleaños es hoy. El compuesto solo es apropiado si trata cada objeto de hoja en la lista de manera consistente.

3. mapeo bidireccional

Los pasos de notificación para la emisión de vacaciones son de la empresa a cada departamento, luego a cada grupo y finalmente al buzón de cada empleado. Esto en sí mismo es un buen ejemplo de un patrón compuesto, pero una situación a considerar es que quizás algunos empleados pertenecen a más de una estructura organizacional. Por ejemplo, si un arquitecto pertenece tanto al grupo de desarrollo como al grupo de arquitectura, la relación entre los objetos no es estrictamente una estructura jerárquica. En este caso, no es adecuado utilizar el modo de combinación. Es probable que el arquitecto reciba dos cuotas de vacaciones.

En esta situación compuesta, debemos establecer una relación de mapeo bidireccional entre el nodo principal y el nodo secundario. Un método simple es agregar colecciones a los objetos de grupo y empleado para guardar las referencias entre sí. Sin embargo, este tipo de referencia mutua es bastante complicado y hay demasiado acoplamiento entre los objetos, lo que dificulta la modificación o eliminación de un objeto. En este momento, podemos introducir un modelo intermediario para administrar estos objetos.

Mejora del rendimiento del patrón compuesto con el patrón de cadena de responsabilidad

En el modo de combinación, si la estructura del árbol es compleja y el número de nodos es grande, el rendimiento puede no ser ideal en el proceso de atravesar el árbol. A veces podemos usar algunos trucos para evitar atravesar todo el árbol en la operación real.Una solución lista para usar es usar el modelo de cadena de responsabilidad. El modo de cadena de responsabilidad generalmente requiere que configuremos manualmente la cadena, pero en el modo compuesto, en realidad se forma una cadena de responsabilidad natural entre el objeto principal y el objeto secundario. Deje que la solicitud pase a lo largo de la cadena desde el objeto principal al objeto secundario, o viceversa, desde el objeto secundario al objeto principal hasta que se encuentre un objeto que pueda manejar la solicitud. Este es también uno de los escenarios de aplicación clásicos del patrón de cadena de responsabilidad.

Cuándo usar patrones compuestos

  • Representa la jerarquía parte-todo de un objeto. El patrón compuesto puede construir convenientemente un árbol para representar la estructura parte-todo de un objeto. Especialmente cuando no estábamos seguros de cuántos niveles existía el árbol durante el desarrollo. Una vez que finalmente se completa la construcción del árbol, solo necesita solicitar el objeto de nivel superior del árbol para realizar operaciones unificadas en todo el árbol. Es muy conveniente agregar y eliminar nodos de árbol en el modo de combinación, y se ajusta al principio abierto-cerrado.

  • El cliente quiere tratar todos los objetos del árbol de manera uniforme. El modo de combinación permite a los clientes ignorar la diferencia entre el objeto de combinación y el objeto de hoja. Al mirar este árbol, el cliente no necesita preocuparse si el objeto que se está procesando actualmente es un objeto de combinación o un objeto de hoja, y no hay necesidad para escribir un montón de declaraciones if y else para tratarlas por separado. Los objetos compuestos y los objetos de hoja harán cada uno su propio trabajo, que es la capacidad más importante del patrón compuesto.

Supongo que te gusta

Origin blog.csdn.net/weixin_45172119/article/details/128716022
Recomendado
Clasificación