minhas informações de contato
Correspondência[email protected]
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:
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.
Diagrama de Classe:
O modelo de cadeia de responsabilidade inclui principalmente as seguintes funções:
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.
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.
Classe cliente (Cliente): Crie uma cadeia de processamento e envie uma solicitação ao objeto processador específico do chefe da cadeia.
O modelo de cadeia de responsabilidade é adequado para os seguintes cenários:
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.
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.
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.
O modelo de cadeia de responsabilidade é amplamente utilizado em muitos campos, incluindo, mas não limitado a:
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):
- // 抽象处理者
- abstract class LogHandler {
- protected int level;
- protected LogHandler nextHandler;
-
- public void setNextHandler(LogHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
-
- //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
- public void logMessage(int level, String message) {
- if (this.level <= level) {
- write(message);
- }
- if (nextHandler != null) {
- nextHandler.logMessage(level, message);
- }
- }
-
- abstract protected void write(String message);
- }
-
- // 具体处理者:ErrorLogHandler
- class ErrorLogHandler extends LogHandler {
- public ErrorLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("ErrorLogHandler: " + message);
- }
- }
-
- // 具体处理者:WarnLogHandler
- class WarnLogHandler extends LogHandler {
- public WarnLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("WarnLogHandler: " + message);
- }
- }
-
- // 具体处理者:InfoLogHandler
- class InfoLogHandler extends LogHandler {
- public InfoLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("InfoLogHandler: " + message);
- }
- }
-
- // 客户端代码
- public class ChainPatternDemo {
- private static LogHandler getChainOfLoggers() {
- // 创建链中的处理者
- LogHandler errorLogHandler = new ErrorLogHandler(3);
-
- LogHandler warnLogHandler = new WarnLogHandler(2);
- warnLogHandler.setNextHandler(errorLogHandler);
-
- LogHandler infoLogHandler = new InfoLogHandler(1);
- infoLogHandler.setNextHandler(warnLogHandler);
-
- return infoLogHandler;
- }
-
- public static void main(String[] args) {
- LogHandler loggerChain = getChainOfLoggers();
-
- loggerChain.logMessage(1, "This is an informational message.");
- loggerChain.logMessage(2, "This is a warning message.");
- loggerChain.logMessage(3, "This is an error message.");
- }
- }
Neste exemplo, definimos três classes concretas de manipuladores de log (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
), 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 ligarlogMessage
mé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.
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.