设计模式-16-责任链模式

简介: 责任链模式(Chain of Responsibility Pattern)就是在一个请求出去后,将请求的接受对象串为一个链路。请求对象只负责将请求发送出去,不管这个链路中哪个对象接受处理,将请求的发送者和接收者进行解耦。属于行为型模式。

责任链模式(Chain of Responsibility Pattern)就是在一个请求出去后,将请求的接受对象串为一个链路。请求对象只负责将请求发送出去,不管这个链路中哪个对象接受处理,将请求的发送者和接收者进行解耦。属于行为型模式。

       在Java中,Servlet的Filter拦截器、Struts2 的拦截器等都是使用了责任链模式。还有全局异常处理,我们捕捉到异常后,一路往下抛,有可能是运行时异常、有可能是自定义异常,会被响应的判断所截获处理。

代码实现:

一、一个异常对象被一条责任链中的三个对象处理

1.新建一个每个处理器都要继承的异常处理接口packagecom.xing.design.chainOfResponsibility;
publicinterfaceExcetionHandle {
/*** 处理异常 * @param type 异常类型*/voidhandle(Stringtype);
/***  设置下一个处理器* @param excetionHandle*/voidsetNextExcetionHandle(ExcetionHandleexcetionHandle);
}
2.建三个处理器类packagecom.xing.design.chainOfResponsibility;
publicclassRunTimeExcetionHandleimplementsExcetionHandle{
privateExcetionHandleexcetionHandle;
@Overridepublicvoidhandle(Stringtype) {
if("运行时异常".equals(type)) {
System.out.println("异常已被RunTimeExcetionHandle处理->"+type);
    }else {
// 处理不了,下一个System.out.println("RunTimeExcetionHandle处理不了->"+type+",下一个");
excetionHandle.handle(type);
    }
  }
@OverridepublicvoidsetNextExcetionHandle(ExcetionHandleexcetionHandle) {
this.excetionHandle=excetionHandle;
  }
}
packagecom.xing.design.chainOfResponsibility;
publicclassClassNotFoundExcetionHandleimplementsExcetionHandle{
privateExcetionHandleexcetionHandle;
@Overridepublicvoidhandle(Stringtype) {
if("未找到类异常".equals(type)) {
System.out.println("异常已被ClassNotFoundExcetionHandle处理->"+type);
    }else {
// 处理不了,下一个System.out.println("ClassNotFoundExcetionHandle处理不了->"+type+",下一个");
excetionHandle.handle(type);
    }
  }
@OverridepublicvoidsetNextExcetionHandle(ExcetionHandleexcetionHandle) {
this.excetionHandle=excetionHandle;
  }
}
packagecom.xing.design.chainOfResponsibility;
publicclassAllExcetionHandleimplementsExcetionHandle{
@Overridepublicvoidhandle(Stringtype) {
System.out.println("异常已被AllExcetionHandle处理->"+type);
  }
@OverridepublicvoidsetNextExcetionHandle(ExcetionHandleexcetionHandle) {
System.out.println("没有其他异常了,AllExcetionHandle就全捕捉掉"+excetionHandle);
  }
}
3.编写main方法测试,将上述处理器串成一条责任链packagecom.xing.design.chainOfResponsibility;
publicclassChainOfResponsibilityDemo {
publicstaticvoidmain(String[] args) {
StringrunTime="运行时异常";
StringclassNotFound="未找到类异常";
StringsysTem="系统异常";
Stringamazing="未知异常";
ExcetionHandlerunTimeExcetionHandle=newRunTimeExcetionHandle();
ExcetionHandleclassNotFoundExcetionHandle=newClassNotFoundExcetionHandle();
ExcetionHandleallExcetionHandle=newAllExcetionHandle();
// 组装责任链,运行时 -> 类未找到 -> 全部异常runTimeExcetionHandle.setNextExcetionHandle(classNotFoundExcetionHandle);
classNotFoundExcetionHandle.setNextExcetionHandle(allExcetionHandle);
// 从第一个处理类开始倒着处理上述异常:System.out.println("---------------------------开始处理【"+amazing+"】---------------------------");
runTimeExcetionHandle.handle(amazing);
System.out.println("---------------------------【"+amazing+"】处理完毕---------------------------");
System.out.println("---------------------------开始处理【"+sysTem+"】---------------------------");
runTimeExcetionHandle.handle(sysTem);
System.out.println("---------------------------【"+sysTem+"】处理完毕---------------------------");
System.out.println("---------------------------开始处理【"+classNotFound+"】---------------------------");
runTimeExcetionHandle.handle(classNotFound);
System.out.println("---------------------------【"+classNotFound+"】处理完毕---------------------------");
System.out.println("---------------------------开始处理【"+runTime+"】---------------------------");
runTimeExcetionHandle.handle(runTime);
System.out.println("---------------------------【"+runTime+"】处理完毕---------------------------");
  }
}

4.测试结果

image.png

       每个接收者都包含对下一个接收者的引用。如果前一个接收者不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

       这么一说,好像if else也算责任链哈!

总结:

       责任链模式将接收者组成一串责任链,发送者不需要知道责任链中哪一个接收者处理的,实现了发送者和接收者的解耦。


END

目录
相关文章
|
8月前
|
设计模式 Java
【设计模式系列笔记】责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它。每个处理者都有一个对下一个处理者的引用。责任链模式常用于处理请求的场景,例如在一个请求需要经过多个步骤或者多个对象来处理的情况下。
97 0
|
8月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
8月前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
47 3
|
3月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
59 9
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
29 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
41 0
|
3月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
21 0
|
3月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
44 0
|
4月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)