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.
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.