0
点赞
收藏
分享

微信扫一扫

设计模式之访问数据结构_ChainOfReponsibility责任链模式_推卸责任


前言

​​博主github​​

​​博主个人博客http://blog.healerjean.com​​

1、解释

场景:假设现在我们去公司领取资料。

1、首先我们向公司前台打听要去哪里领取资料,她告诉我们应该去“营业窗口”。

2、然后等我们到了“营业窗口”后,又被告知应该去“售后部门”。

3、等我们好不容易赶到了“售后部门”,

4、又被告知应该去“资料中心”,

5、因此最后我们又不得不赶到“资料中心”。

像这样,在找到合适的办事人之前,我们被不断地赐给一个有一个人,这就是“推卸责任”。

真实项目中,其实我也有使用过,在小米金融科技,接触的供应链项目,FlowNode流程,用到过,我们是讲Json挨个传递,直到每个节点处理完成。具体可以到的博客中翻找案例代码,绝对是好项目

2、实例代码

本案例已打印日志说明

2.1、抽象父类节点​​AbstractLogger​

package com.hlj.moudle.design.D06访问数据结构.D14ChanOfResponsibility责任链模式;

/**
* @author HealerJean
* @ClassName AbstractLogger
* @date 2019/8/16 15:54.
* @Description 创建抽象的记录器类。
*/
public abstract class AbstractLogger {

/**
* 级别 error 是最高级别3
*/
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;
}

/**
* 输入的基本级别如果跟当前级别比较,如果比当前级别大,则肯定打印,
* 傻瓜 error肯定会打印 info
*/
public void log(int level, String message){
if(this.level <= level){
write(message);
}
if(nextLogger !=null){
nextLogger.log(level, message);
}
}

abstract protected void write(String message);

}

2.2、Error级别

public class ErrorLogger extends AbstractLogger {

public ErrorLogger(int level){
this.level = level;
}

@Override
protected void write(String message) {
System.out.println("Error : " + message);
}
}

2.3、Info级别

public class InfoLogger extends AbstractLogger {

public InfoLogger(int level){
this.level = level;
}

@Override
protected void write(String message) {
System.out.println("info : " + message);
}
}

2.4、Debug级别

public class DebugLogger extends AbstractLogger {

public DebugLogger(int level){
this.level = level;
}

@Override
protected void write(String message) {
System.out.println("Debug : " + message);
}
}

2.5、测试

package com.hlj.moudle.design.D06访问数据结构.D14ChanOfResponsibility责任链模式;

/**
* @author HealerJean
* @ClassName Main
* @date 2019/8/16 15:57.
* @Description
*/
public class Main {

private static AbstractLogger getChainOfLoggers(){
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(infoLogger);

AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
infoLogger.setNextLogger(debugLogger);

return errorLogger;
}

public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();

loggerChain.log(AbstractLogger.ERROR, " error message");
// Error : error message
// info : error message
// Debug : error message


loggerChain.log(AbstractLogger.INFO, "info message");
// info : info message
// info : debug message

loggerChain.log(AbstractLogger.DEBUG, " debug message ");
// Debug : debug message


}
}

3、总结

上面就是讲message消息挨个到各自的节点去处理,一直到处理完成,这既是责任链模式

3.1、优化地方

3.1.1、可以讲上面抽象类的level 放到各自的子类中

3.1.2、nextLogger 时,在初始化时就指定。


请下方留言吧。可与博主自由讨论哦

设计模式之访问数据结构_ChainOfReponsibility责任链模式_推卸责任_责任链模式


举报

相关推荐

0 条评论