Compartilhamento de tecnologia

Padrão de design padrão de cadeia de responsabilidade

2024-07-12

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

O padrão Chain of Responsibility é um padrão de design comportamental que permite que vários objetos manipulem solicitações em sequência, e cada objeto pode escolher se deseja manipular a solicitação ou passá-la para o próximo objeto. Esse padrão proporciona maior flexibilidade e escalabilidade ao desacoplar o remetente e o destinatário das solicitações. A seguir está uma introdução detalhada ao modelo de cadeia de responsabilidade:

1. Definição e ideias centrais

O núcleo do modelo de cadeia de responsabilidade é projetar uma cadeia de solicitação e a identificação do final da cadeia. Ele conecta vários objetos de tratamento de solicitações em uma cadeia e permite que a solicitação passe pela cadeia até que um objeto na cadeia decida tratar a solicitação. O cliente que faz a solicitação não sabe qual objeto da cadeia tratará a solicitação, o que permite que o sistema se reorganize e atribua responsabilidades dinamicamente sem afetar o cliente.

2. Diagrama de classes e funções principais

Diagrama de Classe:

O modelo de cadeia de responsabilidade inclui principalmente as seguintes funções:

  1. Manipulador abstrato (manipulador) : Defina uma interface para processamento de solicitações. Se necessário, a interface pode definir um método para definir e retornar uma referência para a próxima interface. Essa função geralmente é implementada por uma classe ou interface abstrata.

  2. Manipulador de concreto : Depois de receber a solicitação, o processador específico pode optar por processar a solicitação ou encaminhá-la para a próxima parte. Como o processador concreto mantém uma referência para a próxima casa, o processador concreto pode acessar a próxima casa, se necessário.

  3. Classe cliente (Cliente): Crie uma cadeia de processamento e envie uma solicitação ao objeto processador específico do chefe da cadeia.

3. Cenários aplicáveis

O modelo de cadeia de responsabilidade é adequado para os seguintes cenários:

  1. Vários objetos processam conjuntamente uma tarefa: por exemplo, um sistema de aprovação multinível passa a solicitação de aprovação para o próximo nível de aprovador com base na autoridade e no nível do aprovador até que o resultado final da aprovação seja obtido.

  2. Fluxo de processamento de combinação dinâmica: Ao configurar de forma flexível a cadeia de responsabilidade, os objetos de processamento podem ser combinados dinamicamente para implementar diferentes processos de processamento.

  3. Evite o acoplamento direto entre o remetente e o destinatário de uma solicitação: Ao passar a solicitação para a cadeia de responsabilidade, o remetente da solicitação não precisa conhecer o objeto de processamento específico, reduzindo a dependência entre os objetos.

4. Vantagens e Desvantagens

vantagem
  1. Reduzir o acoplamento: Desacopla o remetente e o destinatário da solicitação. A solicitação só é enviada, não importa quem a trata.
  2. Maior flexibilidade na atribuição de objetos: permite adição ou exclusão dinâmica de responsabilidades, alterando membros da cadeia ou movendo seu pedido.
  3. Simplifique objetos: O objeto não precisa conhecer a estrutura da cadeia.
  4. É conveniente adicionar novas classes de processamento de solicitações: Seguindo o princípio de abertura e fechamento, novos processadores podem ser adicionados à cadeia de responsabilidade a qualquer momento sem modificar o código existente, proporcionando boa escalabilidade.
deficiência
  1. Não há garantia de que a solicitação será aceita: se a cadeia de responsabilidade não estiver configurada corretamente ou se um processador não tratar a solicitação corretamente, a solicitação poderá não ser processada.
  2. Problemas de desempenho: Quando a cadeia de responsabilidade é muito longa ou as solicitações são passadas com frequência na cadeia de responsabilidade, o desempenho pode ser afetado.
  3. A depuração é inconveniente: Quando a cadeia de responsabilidade é especialmente longa e tem muitos links, a lógica pode ser mais complicada durante a depuração devido a uma abordagem recursiva.

5. Cenários de aplicação

O modelo de cadeia de responsabilidade é amplamente utilizado em muitos campos, incluindo, mas não limitado a:

  1. Sistema de registro: passe mensagens de log para diferentes criadores de log de acordo com o nível de log, como criador de log de console, criador de log de arquivo, criador de log de banco de dados, etc.
  2. Sistema de tratamento de exceções: Classifique as exceções de acordo com seus tipos, como registro em log, notificações por e-mail, exibição de exceções, etc.
  3. Sistema de aprovação multinível: por exemplo, aprovação de licença, aprovação de compra, etc., a solicitação de aprovação é passada para o aprovador do próximo nível de acordo com a autoridade e o nível do aprovador.

6. Exemplos de implementação

A seguir está um exemplo simples de implementação do padrão de cadeia de responsabilidade, que é usado para processar mensagens de log e passar as mensagens para diferentes processadores de acordo com o nível de log (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. }

Neste exemplo, definimos três classes concretas de manipuladores de log (ErrorLogHandlerWarnLogHandlerInfoLogHandler ), eles lidam com diferentes níveis de mensagens de log, respectivamente. Cada manipulador contém um nível (level ), usado para determinar se mensagens deste nível devem ser processadas.Ao ligarlogMessagemétodo, a solicitação é passada para o primeiro manipulador da cadeia (infoLogHandler ), ele decide se processa a mensagem com base em seu próprio nível e lógica de processamento e então (se não for processado) passa a solicitação para o próximo processador na cadeia. Este processo continua até o final da cadeia ou até que a solicitação seja processada.

Observe que em uma aplicação real, você pode precisarLogHandler A classe adiciona mais métodos e propriedades para dar suporte a lógica e configuração de processamento de log mais complexos. Além disso, os níveis de log normalmente usam enumerações (enum) em vez de números inteiros para melhorar a legibilidade e a manutenção do código.

7. Conclusão

O padrão de cadeia de responsabilidade alcança processamento flexível de solicitações e escalabilidade do sistema conectando vários objetos que tratam de solicitações em uma cadeia e permitindo que as solicitações sejam transmitidas na cadeia até que um objeto na cadeia decida tratar a solicitação.

Se o modelo de cadeia de responsabilidade for útil para você, lembre-se de curtir e salvá-lo.