Compartir tecnología

Patrón de diseño patrón de cadena de responsabilidad.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

El patrón de cadena de responsabilidad es un patrón de diseño de comportamiento que permite que varios objetos manejen solicitudes en secuencia, y cada objeto puede elegir si manejar la solicitud o pasarla al siguiente objeto. Este patrón proporciona mayor flexibilidad y escalabilidad al desacoplar el remitente y el receptor de solicitudes. La siguiente es una introducción detallada al modelo de cadena de responsabilidad:

1. Definición e ideas centrales

El núcleo del modelo de cadena de responsabilidad es diseñar una cadena de solicitudes y una identificación del final de la cadena. Conecta múltiples objetos de manejo de solicitudes en una cadena y permite que la solicitud pase a través de la cadena hasta que un objeto en la cadena decida manejar la solicitud. El cliente que realiza la solicitud no sabe qué objeto de la cadena manejará finalmente la solicitud, lo que permite que el sistema se reorganice dinámicamente y asigne responsabilidades sin afectar al cliente.

2. Diagrama de clases y roles principales.

Diagrama de clase:

El modelo de cadena de responsabilidad incluye principalmente los siguientes roles:

  1. Controlador abstracto (Manejador) : Defina una interfaz para procesar solicitudes. Si es necesario, la interfaz puede definir un método para configurar y devolver una referencia a la siguiente interfaz. Esta función generalmente se implementa mediante una clase o interfaz abstracta.

  2. Manipulador de hormigón : Después de recibir la solicitud, el procesador específico puede optar por procesar la solicitud o pasarla a la siguiente parte. Dado que el procesador de concreto tiene una referencia a la siguiente casa, el procesador de concreto puede acceder a la siguiente casa si es necesario.

  3. Clase de cliente (Cliente): Cree una cadena de procesamiento y envíe una solicitud al objeto de procesador específico del encabezado de la cadena.

3. Escenarios aplicables

El modelo de cadena de responsabilidad es adecuado para los siguientes escenarios:

  1. Varios objetos procesan conjuntamente una tarea: Por ejemplo, un sistema de aprobación de varios niveles pasa la solicitud de aprobación al siguiente nivel de aprobador según la autoridad y el nivel del aprobador hasta que se obtiene el resultado de aprobación final.

  2. Flujo de procesamiento de combinación dinámica: Al configurar de manera flexible la cadena de responsabilidad, los objetos de procesamiento se pueden combinar dinámicamente para implementar diferentes procesos de procesamiento.

  3. Evite el acoplamiento directo entre el remitente y el receptor de una solicitud: Al pasar la solicitud a la cadena de responsabilidad, el remitente de la solicitud no necesita conocer el objeto de procesamiento específico, lo que reduce la dependencia entre objetos.

4. Ventajas y desventajas

ventaja
  1. Reducir el acoplamiento: Desacopla al remitente y al receptor de la solicitud. La solicitud solo se envía, sin importar quién la maneje.
  2. Flexibilidad mejorada en la asignación de objetos: Permite agregar o eliminar responsabilidades dinámicamente cambiando miembros dentro de la cadena o moviendo su orden.
  3. Simplificar objetos: El objeto no necesita conocer la estructura de la cadena.
  4. Es conveniente agregar nuevas clases de procesamiento de solicitudes.: Siguiendo el principio de apertura y cierre, se pueden agregar nuevos procesadores a la cadena de responsabilidad en cualquier momento sin modificar el código existente, lo que proporciona una buena escalabilidad.
defecto
  1. No hay garantía de que la solicitud sea aceptada.: Si la cadena de responsabilidad no está configurada correctamente o un procesador no maneja la solicitud correctamente, es posible que la solicitud no se procese.
  2. Problemas de desempeño: Cuando la cadena de responsabilidad es demasiado larga o las solicitudes pasan con frecuencia en la cadena de responsabilidad, el rendimiento puede verse afectado.
  3. La depuración es inconveniente: Cuando la cadena de responsabilidad es especialmente larga y tiene muchos vínculos, la lógica puede ser más complicada durante la depuración debido a un enfoque recursivo.

5. Escenarios de aplicación

El modelo de cadena de responsabilidad se utiliza ampliamente en muchos campos, incluidos, entre otros:

  1. Sistema de registro: Pase mensajes de registro a diferentes registradores según el nivel de registro, como registrador de consola, registrador de archivos, registrador de base de datos, etc.
  2. Sistema de manejo de excepciones: Clasifique las excepciones según sus tipos, como registro, notificaciones por correo electrónico, visualización de excepciones, etc.
  3. Sistema de aprobación multinivel: Por ejemplo, aprobación de licencia, aprobación de compra, etc., la solicitud de aprobación se pasa al aprobador del siguiente nivel según la autoridad y el nivel del aprobador.

6. Ejemplos de implementación

El siguiente es un ejemplo de implementación simple del patrón de cadena de responsabilidad, que se utiliza para procesar mensajes de registro y pasar los mensajes a diferentes procesadores según el nivel de registro (como DEBUG, INFO, WARN, ERROR):

  1. // 抽象处理者
  2. abstract class LogHandler {
  3. protected int level;
  4. protected LogHandler nextHandler;
  5. public void setNextHandler(LogHandler nextHandler) {
  6. this.nextHandler = nextHandler;
  7. }
  8. //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
  9. public void logMessage(int level, String message) {
  10. if (this.level <= level) {
  11. write(message);
  12. }
  13. if (nextHandler != null) {
  14. nextHandler.logMessage(level, message);
  15. }
  16. }
  17. abstract protected void write(String message);
  18. }
  19. // 具体处理者:ErrorLogHandler
  20. class ErrorLogHandler extends LogHandler {
  21. public ErrorLogHandler(int level) {
  22. this.level = level;
  23. }
  24. @Override
  25. protected void write(String message) {
  26. System.out.println("ErrorLogHandler: " + message);
  27. }
  28. }
  29. // 具体处理者:WarnLogHandler
  30. class WarnLogHandler extends LogHandler {
  31. public WarnLogHandler(int level) {
  32. this.level = level;
  33. }
  34. @Override
  35. protected void write(String message) {
  36. System.out.println("WarnLogHandler: " + message);
  37. }
  38. }
  39. // 具体处理者:InfoLogHandler
  40. class InfoLogHandler extends LogHandler {
  41. public InfoLogHandler(int level) {
  42. this.level = level;
  43. }
  44. @Override
  45. protected void write(String message) {
  46. System.out.println("InfoLogHandler: " + message);
  47. }
  48. }
  49. // 客户端代码
  50. public class ChainPatternDemo {
  51. private static LogHandler getChainOfLoggers() {
  52. // 创建链中的处理者
  53. LogHandler errorLogHandler = new ErrorLogHandler(3);
  54. LogHandler warnLogHandler = new WarnLogHandler(2);
  55. warnLogHandler.setNextHandler(errorLogHandler);
  56. LogHandler infoLogHandler = new InfoLogHandler(1);
  57. infoLogHandler.setNextHandler(warnLogHandler);
  58. return infoLogHandler;
  59. }
  60. public static void main(String[] args) {
  61. LogHandler loggerChain = getChainOfLoggers();
  62. loggerChain.logMessage(1, "This is an informational message.");
  63. loggerChain.logMessage(2, "This is a warning message.");
  64. loggerChain.logMessage(3, "This is an error message.");
  65. }
  66. }

En este ejemplo, definimos tres clases concretas de controlador de registros (ErrorLogHandlerWarnLogHandlerInfoLogHandler ), manejan diferentes niveles de mensajes de registro respectivamente. Cada controlador contiene un nivel (level ), utilizado para determinar si se deben procesar mensajes de este nivel.LlamandologMessagemétodo, la solicitud se pasa al primer controlador de la cadena (infoLogHandler ), decide si procesar el mensaje en función de su propio nivel y lógica de procesamiento y luego (si no se procesa) pasa la solicitud al siguiente procesador de la cadena. Este proceso continúa hasta el final de la cadena o hasta que se procese la solicitud.

Tenga en cuenta que en una aplicación real, es posible que necesiteLogHandler La clase agrega más métodos y propiedades para admitir una configuración y una lógica de procesamiento de registros más complejas. Además, los niveles de registro suelen utilizar enumeraciones (enum) en lugar de números enteros para mejorar la legibilidad y el mantenimiento del código.

7. Conclusión

El patrón de cadena de responsabilidad logra un procesamiento flexible de solicitudes y escalabilidad del sistema al conectar múltiples objetos que manejan solicitudes en una cadena y permitir que la solicitud pase a través de la cadena hasta que un objeto en la cadena decida manejar la solicitud.

Si el modelo de cadena de responsabilidad te resulta útil, recuerda darle me gusta y recopilarlo.