博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
1、什么是责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,避免请求发送者与接收者之间的耦合关系。在责任链模式中,每个处理者对象都包含对下一个处理者对象的引用,形成一个链条,当请求到达时,会依次传递给链条上的处理者进行处理,直到有一个处理者能够处理该请求或者请求到达链条的末端。
责任链模式的核心思想是将请求的发送和处理解耦,使得多个处理者都有机会处理请求,而不是由一个处理者独自承担所有责任。这样可以提高系统的灵活性和可扩展性。
2、责任链模式的优缺点
责任链模式的优点:
降低耦合度:责任链模式将请求发送者和接收者解耦,请求发送者不需要知道处理者的具体信息,只需要将请求发送给第一个处理者即可。
灵活性和可扩展性:责任链模式可以动态地增加或修改处理者,改变处理顺序,灵活地处理请求。
可以处理复杂的请求:责任链模式可以将复杂的请求拆分成多个处理者,每个处理者负责处理一部分逻辑,使得代码更加清晰和易于维护。
责任链模式的缺点:
请求未必被处理:如果没有合适的处理者,请求可能会到达链条的末端而没有被处理,这可能导致一些请求没有得到处理或者处理结果不符合预期。
对于复杂的请求,可能需要遍历整个链条:在处理复杂的请求时,可能需要遍历整个链条,性能上可能有一定的影响。
总结来说,责任链模式适用于需要多个对象按照顺序处理请求的场景,它具有降低耦合度、灵活性和可扩展性的优点,但也要注意处理者的设置和性能问题。
3、责任链模式的应用场景
责任链模式适用于以下场景:
请求的发送者不需要知道请求的具体处理者:责任链模式将请求的发送者和接收者解耦,发送者只需要将请求发送给第一个处理者,而不需要知道具体是谁来处理请求。
多个对象可以处理同一个请求:责任链模式可以将一个请求发送给多个处理者,每个处理者负责处理一部分逻辑,从而实现请求的分发和处理。
需要动态地指定处理者或处理顺序:责任链模式可以动态地增加或修改处理者,改变处理顺序,灵活地处理请求。
可以处理复杂的请求:如果一个请求涉及多个处理环节,每个处理者只负责处理一部分逻辑,责任链模式可以将复杂的请求拆分成多个简单的处理步骤,使得代码更加清晰和易于维护。
需要避免请求发送者和接收者之间的耦合关系:责任链模式可以降低请求发送者和接收者之间的耦合度,每个处理者只需要关注自己的处理逻辑,不需要了解其他处理者的存在。
责任链模式在实际开发中有很多应用,例如审批流程、日志记录、异常处理等。它可以帮助我们将复杂的业务逻辑拆分成多个简单的处理步骤,提高代码的可维护性和灵活性。
4、责任链模式的结构
责任链模式的结构包括以下几个角色:
抽象处理者(Handler):定义了处理请求的接口,通常包含一个处理方法,用于处理请求,并可以设置下一个处理者。
具体处理者(ConcreteHandler):实现了抽象处理者接口,具体处理请求的逻辑。如果自己无法处理该请求,则将请求传递给下一个处理者。
客户端(Client):创建并配置责任链,将请求发送给第一个处理者。
在责任链模式中,请求会从第一个处理者开始,如果该处理者能够处理请求,则直接处理,否则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。这样可以实现请求的分发和处理的解耦,同时也可以动态地增加或修改处理者,改变处理顺序。
责任链模式的结构简单明了,可以灵活地组织和管理处理逻辑,提高代码的可维护性和扩展性。
5、责任链模式的原理
责任链模式的原理是将多个处理者对象组成一个链条,每个处理者对象都可以处理请求,如果当前处理者无法处理请求,则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。
当一个请求到达责任链的起始点时,首先由起始点的处理者进行处理,如果处理者能够处理该请求,则进行处理并结束。如果处理者无法处理该请求,则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。
每个处理者都有一个指向下一个处理者的引用,形成了一个链条。这样,请求会依次经过每个处理者,直到找到能够处理请求的处理者为止。处理者之间的关系可以是单向的,也可以是双向的。
责任链模式的优点是能够动态地增加或修改处理者,灵活性较高。同时,责任链模式也实现了请求的发送者和接收者之间的解耦,请求发送者无需知道具体的处理者是谁,只需要将请求发送给责任链的起始点即可。
责任链模式适用于以下情况:
有多个对象可以处理同一个请求,但具体由哪个对象处理需要在运行时动态确定。
可以动态增加或修改处理者,以及动态改变处理顺序。
需要将请求发送者和接收者解耦,避免耦合度过高。
总之,责任链模式通过将多个处理者组成一个链条,实现了请求的分发和处理的解耦,提高了代码的可维护性和扩展性。
6、责任链模式的代码案例
定义请求类:
package com.pany.camp.design.principle.responsibility;
/**
*
* @description: 请求类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 12:43
*/
public class Request {
private String type;
private String content;
public Request(String type, String content) {
this.type = type;
this.content = content;
}
public String getType() {
return type;
}
public String getContent() {
return content;
}
}
定义一个处理者接口:
package com.pany.camp.design.principle.responsibility;
/**
*
* @description: 处理者接口
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 12:42
*/
public interface Handler {
void setNextHandler(Handler nextHandler);
void handleRequest(Request request);
}
然后,实现具体的处理者类:
package com.pany.camp.design.principle.responsibility;
/**
* @description: 处理者类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 12:43
*/
public class ConcreteHandler implements Handler {
private Handler nextHandler;
@Override
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(Request request) {
if (request.getType().equals("Type1")) {
System.out.println("ConcreteHandler1处理了请求:" + request.getContent());
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
} else {
System.out.println("无法处理该请求:" + request.getContent());
}
}
}
package com.pany.camp.design.principle.responsibility;
/**
*
* @description: 处理者类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 12:44
*/
public class ConcreteHandler2 implements Handler {
private Handler nextHandler;
@Override
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(Request request) {
if (request.getType().equals("Type2")) {
System.out.println("ConcreteHandler2处理了请求:" + request.getContent());
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
} else {
System.out.println("无法处理该请求:" + request.getContent());
}
}
}
使用责任链模式:
package com.pany.camp.design.principle.responsibility;
/**
*
* @description: 客户端
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 12:44
*/
public class Client {
public static void main(String[] args) {
// 创建具体的处理者对象
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler2();
// 设置处理者之间的关系
handler1.setNextHandler(handler2);
// 创建请求
Request request1 = new Request("Type1", "请求1");
Request request2 = new Request("Type2", "请求2");
Request request3 = new Request("Type3", "请求3");
// 处理请求
handler1.handleRequest(request1);
handler1.handleRequest(request2);
handler1.handleRequest(request3);
}
}
具体的处理者对象分别是 ConcreteHandler1 和 ConcreteHandler2 ,它们分别处理了不同类型的请求。如果一个处理者无法处理请求,则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。
输出结果如下:
ConcreteHandler1处理了请求:请求1
ConcreteHandler2处理了请求:请求2
无法处理该请求:请求3
Process finished with exit code 0
💕💕 本文由激流丶创作
💕💕喜欢的话记得点赞收藏啊