责任链模式demo

本文通过一个责任链模式的demo,详细介绍了如何构建和使用责任链。每个对象在处理请求后会检查是否有下一个处理者,以此形成一条处理链。这种模式允许在运行时动态地改变链的结构,同时提供了在链中添加新环节的灵活性。文章分为四个步骤,从创建抽象记录器到实例化不同类型的记录器,最后展示程序执行结果,展示了责任链模式的实现和效果。
摘要由CSDN通过智能技术生成

 责任链模式将请求的发送者和接收者解耦,每当接收一条指令或者一个变化时,责任链上的每一个实例对象都会根据条件来做出相应的变化,责任链模式最核心的代码有两个:1.就是每个实例对象都包含有一个指向下一条实例对象的属性(protected AbstractLogger nextLogger)。2.就是每个对象在处理完当前所做的变化都会查看下一条指令是否为空,如果不为空,则调用下一个对象的通用方法(logMessage)。

因此责任链模式可以随意的在链中每一个环节增加一个新的环节,其中链的顺序的设置可以放在每一个实现类的构造方法里,也可以单独的提出一个抽象方法,然后在一个新的代码里统一的设置链的顺序。

说一些题外的东西,每个类只要实现了抽象类,就相当于每个类都独自占有抽象类的方法。

步骤1:

创建抽象的记录器类AbstractLogger。这是创建通用的的抽象方法,其中包含责任链中的下一个元素nextLogger,和调用链上的下一个对象的通用方法logMessage,通用方法为write。

public abstract class AbstractLogger {
   public static int INFO = 1;
   public static int DEBUG = 2;
   public static int ERROR = 3;
 
   protected int level;
 
   //责任链中的下一个元素
   protected AbstractLogger nextLogger;
 
   public void setNextLogger(AbstractLogger nextLogger){
      this.nextLogger = nextLogger;
   }
 
   public void logMessage(int level, String message){
      if(this.level <= level){
         write(message);
      }
      if(nextLogger !=null){
         nextLogger.logMessage(level, message);
      }
   }
 
   abstract protected void write(String message);
   
}

步骤2:

创建扩展了该记录器类的实体类。

public class ConsoleLogger extends AbstractLogger {
 
   public ConsoleLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("Standard Console::Logger: " + message);
   }
}

 

public class ErrorLogger extends AbstractLogger {
 
   public ErrorLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("Error Console::Logger: " + message);
   }
}
public class FileLogger extends AbstractLogger {
 
   public FileLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("File::Logger: " + message);
   }
}

步骤 3

创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。

public class ChainPatternDemo {
   
   private static AbstractLogger getChainOfLoggers(){
 
      AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
      AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
 
      errorLogger.setNextLogger(fileLogger);
      fileLogger.setNextLogger(consoleLogger);
 
      return errorLogger;  
   }
 
   public static void main(String[] args) {
      AbstractLogger loggerChain = getChainOfLoggers();
 
      loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
 
      loggerChain.logMessage(AbstractLogger.DEBUG, 
         "This is a debug level information.");
 
      loggerChain.logMessage(AbstractLogger.ERROR, 
         "This is an error information.");
   }
}

步骤 4:

执行程序,输出结果:

ConsoleLogger: this is an info message
-------------------------------------------------------------
ConsoleLogger: this is an debug message
FileLogger: this is an debug message
-------------------------------------------------------------
ConsoleLogger: this is an error message
FileLogger: this is an error message
ErrorLogger: this is an error message
-------------------------------------------------------------

这个是将责任链的下一环放到一个统一的地方管理,统一设置责任链的顺序,还可以在程序设计的时候制定好要执行的下一个任务

3个实现类都依此设置

public class ConsoleLogger extends AbstractLogger{

    public ConsoleLogger() {
        this.level = Level.INFO;
        //指定nextLogger为FileLogger
        setNextLogger(new FileLogger());
    }
    @Override    
    public void log(String message) {
        System.out.println("Console logger: " + message);
    }
}

main方法暴露最底层的任务既可

public class ChainPatternDemo {
    public static void main(String[] args) {

        /**         
         * 暴露最低等级既可         
         */        
        AbstractLogger consoleLogger = new ConsoleLogger();

        consoleLogger.logMegger(3, "错误信息");
        System.out.println();
        consoleLogger.logMegger(2, "测试信息");
        System.out.println();
        consoleLogger.logMegger(1, "控制台信息");
    }
}

输出结果:

ConsoleLogger: this is an info message
-------------------------------------------------------------
ConsoleLogger: this is an debug message
FileLogger: this is an debug message
-------------------------------------------------------------
ConsoleLogger: this is an error message
FileLogger: this is an error message
ErrorLogger: this is an error message
-------------------------------------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值