在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Chain of Responsibility Pattern(译)

2016-8-29 13:27| 发布者: zhangjf| 查看: 616| 评论: 0

摘要: 责任链模式 责任链模式顾名思义,对于一个请求会去创建一条接受者链。这种模式会解耦一种类型的请求中接受者和发送者,该模式模式属于行为模式的一种。在该模式当中,一般情况下,每个接受者都会有另外一个接受者的 ...
责任链模式

责任链模式顾名思义,对于一个请求会去创建一条接受者链。这种模式会解耦一种类型的请求中接受者和发送者,该模式模式属于行为模式的一种。
在该模式当中,一般情况下,每个接受者都会有另外一个接受者的引用,如果该接受者无法处理该请求,请求会通过引用传入下一个接受者。

实现

我们创建一个抽象类AbstaractLogger,该类中含有日志的记录等级。然后我们会创建三个logger实现AbstractLogger。每一个logger都会检查并且比较消息的等级与该logger等级,判断打印或者不打印,并且传递消息到下一个logger。

第一步

创建一个抽象的Logger类

AbstractLogger.java

  1. public abstract class AbstractLogger {
  2. public static int INFO = 1;
  3. public static int DEBUG = 2;
  4. public static int ERROR = 3;
  5. protected int level;
  6. //next element in chain or responsibility
  7. protected AbstractLogger nextLogger;
  8. public void setNextLogger(AbstractLogger nextLogger){
  9. this.nextLogger = nextLogger;
  10. }
  11. public void logMessage(int level, String message){
  12. if(this.level <= level){
  13. write(message);
  14. }
  15. if(nextLogger !=null){
  16. nextLogger.logMessage(level, message);
  17. }
  18. }
  19. abstract protected void write(String message);
  20. }
复制代码
第二步

创建具体的类实现AtstractLogger

ConsoleLogger.java

  1. public class ConsoleLogger extends AbstractLogger {
  2. public ConsoleLogger(int level){
  3. this.level = level;
  4. }
  5. @Override
  6. protected void write(String message) {
  7. System.out.println("Standard Console::Logger: " + message);
  8. }
  9. }
复制代码

ErrorLogger.java

  1. public class ErrorLogger extends AbstractLogger {
  2. public ErrorLogger(int level){
  3. this.level = level;
  4. }
  5. @Override
  6. protected void write(String message) {
  7. System.out.println("Error Console::Logger: " + message);
  8. }
  9. }
复制代码

FileLogger.java

  1. public class FileLogger extends AbstractLogger {
  2. public FileLogger(int level){
  3. this.level = level;
  4. }
  5. @Override
  6. protected void write(String message) {
  7. System.out.println("File::Logger: " + message);
  8. }
  9. }
复制代码
第三步

创建不同类型的logger。设置每个Logger的错误等级以及每个logger的Next logger,每一个logger的NextLogger都是当前链的一部分。

ChainPatternDemo.java

  1. public class ChainPatternDemo {
  2. private static AbstractLogger getChainOfLoggers(){
  3. AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
  4. AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
  5. AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
  6. errorLogger.setNextLogger(fileLogger);
  7. fileLogger.setNextLogger(consoleLogger);
  8. return errorLogger;
  9. }
  10. public static void main(String[] args) {
  11. AbstractLogger loggerChain = getChainOfLoggers();
  12. loggerChain.logMessage(AbstractLogger.INFO,
  13. "This is an information.");
  14. loggerChain.logMessage(AbstractLogger.DEBUG,
  15. "This is an debug level information.");
  16. loggerChain.logMessage(AbstractLogger.ERROR,
  17. "This is an error information.");
  18. }
  19. }
复制代码
第四步

校验输出

  1. Standard Console::Logger: This is an information.
  2. File::Logger: This is an debug level information.
  3. Standard Console::Logger: This is an debug level information.
  4. Error Console::Logger: This is an error information.
  5. File::Logger: This is an error information.
  6. Standard Console::Logger: This is an error information.
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 01:05

Copyright 2015-2025 djqfx

返回顶部