责任链模式,是什么类型的模式呢?
2022-04-30 本文已影响0人
程就人生
你的项目中有用到责任链模式吗?
责任链模式主要解决什么问题呢?
有哪些框架涉及到责任链模式,你知道吗?
责任链模式(chain of responsibility pattern),为请求创建了一个接收者对象的链,将请求与处理解耦,是一种行为型模式。 业务场景:一个请求,多种对象处理的情况;主要为了解决请求和处理对象的耦合。 关键代理:处理类里聚合了自己,接收到请求后,符合条件就处理;否则就传递给下一个类处理。
下面看UML类图:
代码实现步骤:
1.日志抽象类;
/**
* 1.日志抽象类
* @author 程就人生
* @Date
*/
public abstract class AbstractLogger {
// 一般的日志信息
public static int INFO = 1;
// debug版本打印的信息
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 msg){
// 如果日志打印级别等于当前级别,则打印日志信息
if(this.level <= level){
write(msg);
}
// 如果责任链中的下一个元素不为空,则继续传递下去
if(nextLogger != null){
nextLogger.logMessage(level, msg);
}
}
// 打印日志
abstract void write(String msg);
}
2.抽象日志类的继承者3种日志级别;
/**
* 2.1 基本信息打印类-抽象日志的继承者
* @author 程就人生
* @Date
*/
public class InfoLogger extends AbstractLogger{
public InfoLogger(int level) {
this.level = level;
}
@Override
void write(String msg) {
System.out.println("info:" + msg);
}
}
/**
* 2.2 debug信息打印类-抽象日志的继承者
* @author 程就人生
* @Date
*/
public class DebugLogger extends AbstractLogger{
public DebugLogger(int level){
this.level = level;
}
@Override
void write(String msg) {
System.out.println("debug:" + msg);
}
}
/**
* 2.3 错误信息打印类-抽象日志的继承者
* @author 程就人生
* @Date
*/
public class ErrorLogger extends AbstractLogger{
public ErrorLogger(int level){
this.level = level;
}
@Override
void write(String msg) {
System.out.println("error:" + msg);
}
}
3.日志工厂类,设置日志处理链;
/**
* 3.对日志进行管理
* @author 程就人生
* @Date
*/
public class LoggerFactory {
// 设置日志处理链
public static AbstractLogger getChainOfLogger(){
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
// error的下一个处理类是debugLoogger
errorLogger.setNextLogger(debugLogger);
// debug的写一个处理类是infoLogger
debugLogger.setNextLogger(infoLogger);
return errorLogger;
}
}
4.测试代码:
public static void main(String[] argo){
AbstractLogger logger = LoggerFactory.getChainOfLogger();
logger.logMessage(AbstractLogger.DEBUG, "debug类日志");
}
测试结果:
debug:debug类日志
info:debug类日志
这段代码的意思是:日志输出有三个级别,第一个是info类,第二个为debug类,第三个为error类;如果设置了debug类,那么小于或等于该日志级别的日志类都需要处理,因此输出了debug和info两种打印信息。
最后总结
责任链模式的主要职责就是对请求和处理进行解耦,特别是在一个请求中涉及到多种业务逻辑的场景,可以针对每种业务逻辑写一个处理器,每种业务逻辑之间互不干涉,这就达到了对业务逻辑处理解耦的作用。
做过即时通讯的小伙伴,用过Netty框架的小伙伴,说到责任链模式,一定再熟悉不过了。服务器端收到聊天消息,有可能是登录请求,有可能是单聊,还有可能是群聊,这时就需要用到责任链模式了。责任链中有处理登录、登出的处理器、单聊的处理器、群聊的处理器,每种消息会被对应类型的处理器处理,业务逻辑相互独立,互不干扰。
除此之外,你还能举出其他关于责任链模式的例子吗?