深入浅出职责链模式
简介
职责链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。
责任链模式涉及到的角色如下所示:
● **抽象处理者(Handler)角色:**定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
● **具体处理者(ConcreteHandler)角色:**具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
场景说明
- 批假条
- 处理日志
- …
在这里我们就代码实现下日志处理中的职责链模式:
假设一个事件需要进行日志处理,一共有Info、Warning、Error三个等级,每个等级都有相应的日志记录功能,记录日志时需要从低到高进行记录,首先要进行Info级别的记录,如果需要Error级别的日志则无法处理,所以需要高级别的日志记录器进行记录。
代码实现
BaseLogger.java
/** * @desc: 抽象职责处理类 * @author: YanMingXin * @create: 2021/8/14-22:11 **/ public abstract class BaseLogger { private BaseLogger logger; protected final String INFO_LEVEL = "info"; protected final String WARNING_LEVEL = "warning"; protected final String ERROR_LEVEL = "error"; public BaseLogger getLogger() { return logger; } public void setLogger(BaseLogger logger) { this.logger = logger; } /** * 输出信息 * * @param logLevel */ public abstract void loggerMessage(String logLevel); }
ErrorLogger.java
/** * @desc: Error具体处理类 * @author: YanMingXin * @create: 2021/8/14-22:12 **/ public class ErrorLogger extends BaseLogger { @Override public void loggerMessage(String logLevel) { if (ERROR_LEVEL.equals(logLevel)) { System.out.println("error level log ......"); } else { getLogger().loggerMessage(logLevel); } } }
InfoLogger.java
/** * @desc: Info具体处理类 * @author: YanMingXin * @create: 2021/8/14-22:11 **/ public class InfoLogger extends BaseLogger { @Override public void loggerMessage(String logLevel) { if (INFO_LEVEL.equals(logLevel)) { System.out.println("info level log ......"); } else { getLogger().loggerMessage(logLevel); } } }
WarningLogger.java
/** * @desc: Warning具体处理类 * @author: YanMingXin * @create: 2021/8/14-22:12 **/ public class WarningLogger extends BaseLogger{ @Override public void loggerMessage(String logLevel) { if (WARNING_LEVEL.equals(logLevel)) { System.out.println("warning level log ......"); } else { getLogger().loggerMessage(logLevel); } } }
CorModelTest.java
/** * @desc: 职责链模式(责任链模式)测试类 * @author: YanMingXin * @create: 2021/8/14-21:58 **/ public class CorModelTest { public static void main(String[] args) { InfoLogger infoLogger = new InfoLogger(); WarningLogger warningLogger = new WarningLogger(); ErrorLogger errorLogger = new ErrorLogger(); //生成职责链 infoLogger.setLogger(warningLogger); warningLogger.setLogger(errorLogger); infoLogger.loggerMessage("error"); infoLogger.loggerMessage("info"); infoLogger.loggerMessage("warning"); } }
测试结果: