Latest web development tutorials

Cadena de patrón de responsabilidad

Como su nombre indica, patrón de cadena de Responsabilidad (Cadena de Responsabilidad del patrón) para la solicitud de creación de una cadena de un objeto receptor. Este tipo de patrón dado a la solicitud, el remitente y el destinatario de la solicitud de desacoplamiento. Este tipo de patrones de diseño pertenecen los patrones de comportamiento.

En este modo, cada receptor por lo general contiene una referencia a otro destinatario. Si un objeto no puede procesar la solicitud, entonces será la misma petición al siguiente recipiente, y así sucesivamente.

introducción

Intención: Evitar que solicita el emisor y el receptor están acoplados entre sí de manera que varios objetos son susceptibles de recibir las solicitudes, estos objetos estarán conectados en una cadena, y remitir la información a lo largo de la cadena hasta un objeto que maneja hasta el momento.

cadena de servicio del procesador Procesador responsable del manejo de las solicitudes, los clientes sólo tienen que enviar la solicitud a la cadena de responsabilidad puede, no tiene que preocuparse de los detalles y las solicitudes de procesamiento de solicitud de transferencia, por lo que la cadena de responsabilidades y la solicitud de lasolicitud del remitente: la principal solucióndesacoplado.

Cuándo usar: cuando se trata de una gran cantidad de carreteras para filtrar los mensajes.

Cómo corregir: clases de interceptación implementan una interfaz unificada.

El código de la llave: Handler dentro de la polimerización en sí, en HanleRequest en su caso para determinar si, si se aprueban las condiciones hacia abajo, no hacia arriba, y delante de él traspasó el conjunto.

Ejemplos de aplicación: 1, El sueño del Pabellón Rojo "Drumming pase a pasar."2, eventos JS burbujeante. 3, JAVA WEB de codificación en el Apache Tomcat para el procesamiento, interceptor Struts2, filtro de servlet JSP.

Ventajas: 1, reducen el acoplamiento.Se pide al emisor y al receptor de desacoplamiento. 2, objeto simplificado. Por lo que los objetos no necesitan conocer la estructura de la cadena. 3, para mejorar la flexibilidad de las responsabilidades asignadas a objetos. Cambiando los miembros de la cadena o movilizar su orden, lo que permite añadir o eliminar dinámico pasivo. 4, añade una nueva clase del controlador de solicitudes es muy conveniente.

Desventajas: 1, no puede garantizar que la solicitud debe ser recibida.2, el rendimiento del sistema se verá afectado, pero menos conveniente durante la depuración del código puede hacer que la llamada de ciclo. 3, no son necesariamente características fácilmente observables interferir con la depuración en tiempo de ejecución.

Escenarios de uso: 1, más de un objeto puede manejar la misma petición, específicamente cuál es el objeto de procesar la solicitud se determina automáticamente por el tiempo de ejecución.2, sin especificar explícitamente el destinatario para enviar una solicitud a una pluralidad de objetos. 3, un conjunto de objetos pueden ser asignados dinámicamente para procesar la solicitud.

Nota: encontrado en muchas aplicaciones en JAVA WEB.

realización

Creamos unAbstractLoggerclaseabstracta,con el nivel de registro detallado. A continuación, crear tres tipos de grabadoras se extiendenAbstractLogger.Cada registrador de mensajes de nivel si su propio nivel, si se imprime a continuación, de acuerdo con ellas, de lo contrario, no se imprimirá el mensaje a la siguiente y un grabador.

Cadena de Responsabilidad patrón diagrama UML

Paso 1

Crear un registro de clase abstracta.

AbstractLogger.java

clase abstracta pública AbstractLogger {
   public static int INFO = 1;
   public int estática DEBUG = 2;
   public int error estático = 3;

   int nivel protegido;

   // La cadena de responsabilidad en el siguiente elemento protegido AbstractLogger nextLogger;

   pública setNextLogger vacío (AbstractLogger nextLogger) {
      this.nextLogger = nextLogger;
   }

   logMessage public void (int nivel, String mensaje) {
      si (this.level <level =) {
         escribir (mensaje);
      }
      si (nextLogger! = null) {
         nextLogger.logMessage (nivel, mensaje);
      }
   }

   abstracta protegido contra escritura void (String mensaje);
	
}

Paso 2

Crear clases de entidad que amplían la clase de registro.

ConsoleLogger.java

ConsoleLogger clase pública se extiende AbstractLogger {

   ConsoleLogger pública (nivel int) {
      this.level = Nivel;
   }

   @ Override
   protegido contra escritura void (String mensaje) {		
      System.out.println ( "estándar de la consola :: Logger:" + mensaje);
   }
}

ErrorLogger.java

ErrorLogger clase pública se extiende AbstractLogger {

   ErrorLogger pública (nivel int) {
      this.level = Nivel;
   }

   @ Override
   protegido contra escritura void (String mensaje) {		
      System.out.println ( "Error Console :: Logger:" + mensaje);
   }
}

FileLogger.java

clase pública se extiende FileLogger AbstractLogger {

   FileLogger pública (nivel int) {
      this.level = Nivel;
   }

   @ Override
   protegido contra escritura void (String mensaje) {		
      System.out.println ( "Archivo :: Logger:" + mensaje);
   }
}

paso 3

Crear diferentes tipos de grabadoras. darles diferentes niveles de error, y el establecimiento de un registro en cada una de la grabadora. Cada siguiente representante grabadora logger es parte de la cadena.

ChainPatternDemo.java

ChainPatternDemo public class {
	
   getChainOfLoggers AbstractLogger estáticas privadas () {

      AbstractLogger errorLogger = new ErrorLogger (AbstractLogger.ERROR);
      AbstractLogger FileLogger = new FileLogger (AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = new ConsoleLogger (AbstractLogger.INFO);

      errorLogger.setNextLogger (FileLogger);
      fileLogger.setNextLogger (consoleLogger);

      volver errorLogger;	
   }

   principales argumentos (String []) {public static void
      AbstractLogger loggerChain = getChainOfLoggers ();

      loggerChain.logMessage (AbstractLogger.INFO, 
         "Se trata de una información.");

      loggerChain.logMessage (AbstractLogger.DEBUG, 
         "Se trata de una información de nivel de depuración.");

      loggerChain.logMessage (AbstractLogger.ERROR, 
         "Se trata de una información de error.");
   }
}

Paso 4

Verifique la salida.

Consola estándar :: Logger: Se trata de una información.
Archivo :: Logger: Se trata de una información de nivel de depuración.
Consola estándar :: Logger: Se trata de una información de nivel de depuración.
Consola de errores :: Logger: Se trata de una información de error.
Archivo :: Logger: Se trata de una información de error.
Consola estándar :: Logger: Se trata de una información de error.