Latest web development tutorials

Chain of Responsibility

Como o nome sugere, Chain of Responsibility (Chain of Responsibility) para a solicitação para criar uma cadeia de um objeto receptor. Este tipo de modelo dado ao pedido, o remetente eo destinatário da dissociação pedido. Este tipo de padrões de projeto pertencem padrões comportamentais.

Neste modo, cada destinatário geralmente contém uma referência a outro receptor. Se um objecto não pode processar o pedido, então será o mesmo pedido para o lado receptor, e assim por diante.

introdução

Intenção: Evitar solicitando o emissor eo receptor são acoplados em conjunto para que vários objetos são susceptíveis de receber os pedidos, esses objetos serão ligados em uma cadeia e passar a solicitação ao longo da cadeia até que um objeto lida com ele até agora.

Processador cadeia dever responsável pelo tratamento de pedidos, os clientes só precisam enviar a solicitação para a cadeia de responsabilidade pode, não precisa preocupar os detalhes e processamento de pedidos de transferência de solicitação, portanto, a cadeia de responsabilidade ea solicitação dopedido do remetente: a principal soluçãodissociado.

Quando usar: quando se lida com um monte de estrada para filtrar mensagens.

Como corrigir: aulas de intercepção implementar uma interface unificada.

O código de chave: Handler dentro do próprio polimerização, em HanleRequest se for o caso, determinar se, se as condições são passadas não para cima, diante de quem passou para o conjunto.

Exemplos de aplicação: 1, A Dream of Red Mansions "pass Drumming para gastar."2, eventos JS borbulhante. 3, Java Web Codificação no Apache Tomcat para o processamento, Struts2 interceptor, Filtro jsp servlet.

Vantagens: 1, reduzir o acoplamento.Ele pede que o emissor eo receptor dissociação. 2, objeto simplificada. Assim que os objetos não precisa conhecer a estrutura da cadeia. 3, para aumentar a flexibilidade das responsabilidades objeto atribuído. Ao alterar os membros da cadeia ou mobilizar sua ordem, permitindo add dinâmica ou excluir responsabilidade. 4, adicione uma nova classe do manipulador de solicitação é muito conveniente.

Desvantagens: 1, não pode garantir que o pedido deve ser recebido.2, o desempenho do sistema será afetado, mas menos conveniente durante a depuração do código pode causar a chamada do ciclo. 3, pode não ser facilmente observáveis ​​características de tempo de execução dificultar a depuração.

cenários de uso: 1, mais de um objeto pode lidar com o mesmo pedido, designadamente qual objeto para processar o pedido é automaticamente determinada pelo tempo de execução.2, sem especificar explicitamente o destinatário para enviar uma solicitação para uma pluralidade de objetos. 3, um conjunto de objetos podem ser atribuídos dinamicamente para processar o pedido.

Nota: encontrado em muitas aplicações em Java Web.

realização

Criamos umAbstractLoggerclasseabstrata,com nível de log detalhado. Em seguida, criamos três tipos de gravadores são estendidosAbstractLogger.Cada mensagens nível logger se o seu próprio nível, se depois impressa em conformidade, caso contrário ele não será impressa a mensagem para o seguinte e um gravador.

Chain of Responsibility UML diagrama

passo 1

Criar registro de classe abstrata.

AbstractLogger.java

public abstract class AbstractLogger {
   public static int INFO = 1;
   int DEBUG public static = 2;
   int ERROR public static = 3;

   int level protegida;

   // A cadeia de responsabilidade no próximo elemento protegido AbstractLogger nextLogger;

   setNextLogger public void (AbstractLogger nextLogger) {
      this.nextLogger = nextLogger;
   }

   logMessage public void (int level, mensagem String) {
      if (this.level <= nível) {
         escrever (mensagem);
      }
      if (nextLogger! = null) {
         nextLogger.logMessage (nível, mensagem);
      }
   }

   abstrato protegido contra gravação void (String message);
	
}

passo 2

Criar classes de entidade que estendem a classe de registro.

ConsoleLogger.java

classe pública ConsoleLogger estende AbstractLogger {

   pública ConsoleLogger (nível int) {
      this.level = nível;
   }

   @Override
   protegido contra gravação void (String message) {		
      System.out.println ( "Console Padrão :: Logger:" + message);
   }
}

ErrorLogger.java

classe pública ErrorLogger estende AbstractLogger {

   pública ErrorLogger (nível int) {
      this.level = nível;
   }

   @Override
   protegido contra gravação void (String message) {		
      System.out.println ( "Erro Console :: Logger:" + message);
   }
}

FileLogger.java

classe pública FileLogger estende AbstractLogger {

   pública FileLogger (nível int) {
      this.level = nível;
   }

   @Override
   protegido contra gravação void (String message) {		
      System.out.println ( "File :: Logger:" + message);
   }
}

passo 3

Criar diferentes tipos de gravadores. Dê-lhes diferentes níveis de erro e estabelecendo um recorde em cada um gravador. Cada gravador logger próximo representante faz parte da cadeia.

ChainPatternDemo.java

ChainPatternDemo classe pública {
	
   getChainOfLoggers AbstractLogger estáticos privados () {

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

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

      voltar errorLogger;	
   }

   main (String [] args) public static void {
      AbstractLogger loggerChain getChainOfLoggers = ();

      loggerChain.logMessage (AbstractLogger.INFO, 
         "Esta é uma informação.");

      loggerChain.logMessage (AbstractLogger.DEBUG, 
         "Esta é uma informação de nível de depuração.");

      loggerChain.logMessage (AbstractLogger.ERROR, 
         "Esta é uma informação de erro.");
   }
}

passo 4

Verifique saída.

Console Padrão :: Logger: Esta é uma informação.
File :: Logger: Esta é uma informação nível de depuração.
Console Padrão :: Logger: Esta é uma informação nível de depuração.
Erro Console :: Logger: Esta é uma informação de erro.
File :: Logger: Esta é uma informação de erro.
Console Padrão :: Logger: Esta é uma informação de erro.