网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
public abstract class Handler {
protected Handler nextHandler = null;
public abstract void handle();
public Handler getNextHandler() {
return nextHandler;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
}
public class HandlerA extends Handler{
@Override
public void handle() {
if(nextHandler == null){
System.out.println("HandlerA handle ...");
}else{
nextHandler.handle();
}
}
}
public class HandlerB extends Handler{
@Override
public void handle() {
if(nextHandler == null){
System.out.println("HandlerB handle ...");
}else{
nextHandler.handle();
}
}
}
public class HandlerC extends Handler{
@Override
public void handle() {
if(getNextHandler() == null){
System.out.println("HandlerC handle ...");
}else{
getNextHandler().handle();
}
}
}
//测试
public class Client{
public static void main(String[] args) {
Handler handlerA = new HandlerA();
Handler handlerB = new HandlerB();
handlerA.setNextHandler(handlerB);
handlerA.handle();
}
}
运行结果:
HandlerC handle ...
从上面代码,我们可以画出UML图:
从UML图中,我们又可以看出,责任链模式中有两个非常重要的角色:
(1)、抽象处理者角色(Handler)
定义处理请求的接口。接口可以也可以给出一个方法以设定和返回对下个对象引用。这个角色通常由一个Java抽象类或者Java接口实现。
(2)、具体处理者角色(HandlerA、HandlerB、HandlerC)
具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下个对象。由于具体处理者持有对下家的引用。
责任链模式的优缺点
- 优点:请求和处理分开,两者解耦,提供系统的灵活性。
- 缺点:性能能问,一个链非常长的时候,非常耗时。因为我们避免建立很长的链。
生活中的案例
在日常生活中,责任链模式是比较常见的。我们平时处理工作中的一些事务,往往是各部门协同合作来完成某一个任务的。而每个部门都有各自的职责,因此,很多时候事情完成一半,便会转交到下一个部门,直到所有部门都审批通过,事情才能完成。
责任链模式主要解耦了请求与处理,客户只需将请求发送到链上即可,不需要关心请求的具体内容和处理细节,请求会自动进行传递,直至有节点对象进行处理。
责任链模式主要适用于以下应用场景:
- 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交请求。
- 可动态指定一组对象处理请求。
请假流程的代码实现
下面我们来对,前面的案例:OA上请假流程做一个Java代码的实现。
抽象处理者:领导类
public abstract class Leader {
private Leader next;
public void setNext(Leader next) {
this.next = next;
}
public Leader getNext() {
return next;
}
//处理请求的方法
public abstract void handleRequest(double LeaveDays);
}
项目负责人
public class ProjectLeader extends Leader {
@Override
public void handleRequest(double LeaveDays) {
if (LeaveDays <= 0.5) {
System.out.println("项目负责人批准您请假" + LeaveDays + "天。");
} else {
if (getNext() != null) {
getNext().handleRequest(LeaveDays);
} else {
System.out.println("请假天数太多,没有人批准该假条!");
}
}
}
}
技术总监
public class TechnicalDirectorLeader extends Leader {
@Override
public void handleRequest(double LeaveDays) {
if (LeaveDays <= 1) {
System.out.println("技术总监批准您请假" + LeaveDays + "天。");
} else {
if (getNext() != null) {
getNext().handleRequest(LeaveDays);
} else {
System.out.println("请假天数太多,没有人批准该假条!");
}
}
}
}
Boss
public class BossLeader extends Leader {
@Override
public void handleRequest(double LeaveDays) {
if (LeaveDays >= 2 && LeaveDays <= 30) {
System.out.println("Boss批准您请假" + LeaveDays + "天。");
} else {
if (getNext() != null) {
getNext().handleRequest(LeaveDays);
} else {
System.out.println("请假天数太多,没有人批准该假条!");
}
}
}
}
发起审批
public class LeaveApproval {
public static void main(String[] args) {
//组装责任链
Leader projectLeader = new ProjectLeader();
Leader technicalDirectorLeader = new TechnicalDirectorLeader();
Leader bossLeader = new BossLeader();
projectLeader.setNext(technicalDirectorLeader);
technicalDirectorLeader.setNext(bossLeader);
//请假两天,提交请假流程,开启审批环节,
projectLeader.handleRequest(2);
}
}
审批结果
Boss批准您请假2.0天。
如果请假天数是31天,审批结果
请假天数太多,没有人批准该假条!
整个请假流程为:
把这张流程图改成纵向:
就这么一环套一环的,使用上面两个例子和两张图来理解责任链模式是不是就更轻松了?
自己吹牛逼,没什么用,下面来看看大神们是怎么使用责任链模式的。
大佬们是如何使用的
在Spring、Mybatis等框架中,都用使用到责任链模式,下面先来看在Spring中是如何使用的。
在Spring MVC中的org.springframework.web.servlet.DispatcherServlet
类中:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
wzjOc-1715592591814)]
[外链图片转存中…(img-UbdQAjLx-1715592591815)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!