前言
大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案。大聪明本着“独乐乐不如众乐乐”的宗旨与大家分享一下设计模式的学习心得。
责任链模式
🍓🍓什么是责任链模式🍓🍓
在讲责任链模式之前,我们先来看一下它的定义👇
通俗点来说,它为了保证让多个对象都有可能接收请求,于是就将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,同时实现了请求发送者与请求接收者直接的解耦。(请求发送者只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递,即实现了二者之间的解耦)
这就有点像一句俗话 —— “大懒支小懒”,包工头接到了一份搬砖的工作,于是就把工作分配给了大懒,大懒想:搬砖这么累,我才不干呢,给下面的人分配去,总会有人干的😎!于是就将任务分配给小懒;小懒如果也不想干的话,就将任务继续分配给小小懒… 直到任务分配给了小小小…小懒,他才尽心尽力的搬完了砖(心疼他三秒钟🙁),也就让包工头赚到了钱。在这个例子中,搬砖的工作就是请求;包工头就是请求的发送者;大懒 → 小懒 → … → 小小小…小懒为请求接受者链,这就是一个很形象的责任链模式的体现✌。
通过上面的例子,我们可以总结出来责任链模式中的三个角色:
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
🍓🍓责任链模式的实现🍓🍓
🍎🍎创建抽象的日志记录器类🍎🍎
/**
* 抽象的日志记录器类
* @description: AbstractLogger
* @author: 庄霸.liziye
* @create: 2022-04-16 07:29
**/
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);
}
🍎🍎创建扩展了该记录器类的实体类🍎🍎
/**
* 创建扩展了该记录器类的实体类
* @description: InfoLogger
* @author: 庄霸.liziye
* @create: 2022-04-16 07:38
**/
class InfoLogger extends AbstractLogger {
public InfoLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Info Logger:" + message);
}
}
class DeBugLogger extends AbstractLogger {
public DeBugLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("DeBug Logger:" + message);
}
}
class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Logger:" + message);
}
}
🍎🍎创建不同类型的记录器🍎🍎
/**
* @description: Test
* @author: 庄霸.liziye
* @create: 2022-04-16 07:51
**/
public class Test {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
AbstractLogger deBugLogger = new DeBugLogger(AbstractLogger.DEBUG);
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
infoLogger.setNextLogger(deBugLogger);
deBugLogger.setNextLogger(errorLogger);
return infoLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "这是普通日志信息");
loggerChain.logMessage(AbstractLogger.DEBUG,"这是调试日志信息");
loggerChain.logMessage(AbstractLogger.ERROR,"这是错误日志信息");
}
}
🍎🍎代码执行结果🍎🍎
🍓🍓责任链模式的优、缺点🍓🍓
最后我们总结一下责任链模式的优点与缺点👇
🍌🍌优点🍌🍌
🍌🍌缺点🍌🍌
小结
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。