责任链模式
责任链模式的定义:
使多个对象都有机会处理请求,从而避免了请求发送者和请求接受者之间的耦合关系,将这些对象连城一条链,并沿着这条链传递请求,直到有对象处理它为止。
责任链模式涉及的角色:
- Handler 抽象处理者:该角色对请求进行抽象,并定义一个方法以设定和返回对下一个处理者的引用
- Concrete Handler 具体处理者:该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者
责任链模式的简单示例
抽象处理者
抽象处理者一般采用抽象类,抽象类中有指向下一个抽象处理者的指针,并且定义在何种情况下会将请求转交到下一处理者,并且定义了请求处理的接口
public abstract class Handler {
private Handler nexthandler;
public void setNextHandler(Handler handler) {
this.nexthandler = handler;
}
public Response processRequest(Request req) {
Response res = null;
if(req.getReqLevel() == this.getRequestLevel()) {
res = new Response();
res.setRescode(-1);
res.setRes(this.handleRequest(req));
}else {
if (this.nexthandler != null) {
res = this.nexthandler.processRequest(req);
}else {
System.out.println("常规处理");
res = new Response();
res.setRescode(-1);
res.setRes("此请求未得到相应对象进行处理");
}
}
return res;
}
protected abstract int getRequestLevel();
protected abstract String handleRequest(Request req);
}
具体处理者
具体处理者主要完成对请求的处理
- ConcreteHandler1
public class ConcreteHandller1 extends Handler {
@Override
protected int getRequestLevel() {
return HandleLevel.Min.getLevel();
}
@Override
protected String handleRequest(Request req) {
System.out.println("第一节点开始处理");
System.out.println(req.getVar());
System.out.println("第一节点处理结束");
return "res of " + req.toString();
}
}
2 ConcreteHandler2
public class ConcreteHandller2 extends Handler {
@Override
protected int getRequestLevel() {
return HandleLevel.Mid.getLevel();
}
@Override
protected String handleRequest(Request req) {
System.out.println("第二节点开始处理");
System.out.println(req.getVar());
System.out.println("第二节点处理结束");
return "res of " + req.toString();
}
}
- ConcreteHandler3
public class ConcreteHandller3 extends Handler {
@Override
protected int getRequestLevel() {
return HandleLevel.Max.getLevel();
}
@Override
protected String handleRequest(Request req) {
System.out.println("第三节点开始处理");
System.out.println(req.getVar());
System.out.println("第三节点处理结束");
return "res of " + req.toString();
}
}
请求响应对象
- Request
public class Request {
private int reqLevel;
private String var;
public int getReqLevel() {
return reqLevel;
}
public void setReqLevel(int reqLevel) {
this.reqLevel = reqLevel;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
}
- Response
public class Response {
private int rescode;
private String res;
public int getRescode() {
return rescode;
}
public void setRescode(int rescode) {
this.rescode = rescode;
}
public String getRes() {
return res;
}
public void setRes(String res) {
this.res = res;
}
}
处理等级枚举
public enum HandleLevel {
Min(1),Mid(5),Max(9);
private int level;
HandleLevel(int level){
this.level = level;
}
public int getLevel() {
return level;
}
}
客户端调用
在客户端的调用中,我们发现,具体处理对象连城了一条链。
public class Client {
public static void main(String[] args) {
Handler responseChain = new ConcreteHandller1();
Handler node2 = new ConcreteHandller2();
Handler node3 = new ConcreteHandller3();
node2.setNextHandler(node3);
responseChain.setNextHandler(node2);
Request req = new Request();
req.setReqLevel(HandleLevel.Max.getLevel());
req.setVar("req1");
Response res = responseChain.processRequest(req);
System.out.println(res.getRes());
}
}
责任链模式的优缺点和应用场景
责任链模式优点:
- 将请求和处理分开,请求者不知道处理者是谁,处理者也不知道请求者的全貌
- 提高了系统的灵活性
责任链模式的缺点:
- 性能低下,任何一个请求都是从头到尾的执行
- 调试不方便
责任链模式要尽量避免链中节点数量过多的情况,避免出现超长链的情况。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。