博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式18_责任链
阅读量:4294 次
发布时间:2019-05-27

本文共 1949 字,大约阅读时间需要 6 分钟。

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

实例:

我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。
其实是通过构造类似链表结构的执行链条,在开发中如果有结构类似的if-else,可以通过这种结构进行简化。(比如log日志的这种设计就非常好)

代码:

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);   }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);   }}**构造链条** 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.");   }

转载地址:http://wwfws.baihongyu.com/

你可能感兴趣的文章
opencv配置
查看>>
rt-thread的内核对象管理深入解析
查看>>
LiteOS los_config.h说明
查看>>
从零开始学习FFT(快速傅里叶变换)
查看>>
Makefile教程
查看>>
arm-none-eabi交叉编译工具常用的一些指令
查看>>
Ubuntu 常用解压与压缩命令
查看>>
C语言结构体指针变量作函数参数
查看>>
C语言动态存储分配
查看>>
文科生清晰理解傅里叶变换
查看>>
C++数据类型
查看>>
C语言整型数据(整数)
查看>>
C语言常量与变量
查看>>
C语言实型数据(浮点数)
查看>>
C语言数据类型转换
查看>>
C语言指针变量作为函数参数
查看>>
C语言局部变量和全局变量
查看>>
C语言变量的存储类别
查看>>
C语言结构体指针变量作函数参数
查看>>
C语言动态存储分配
查看>>