2023-06-15  阅读(42)
原文作者: 求和的小熊猫 原文地址:https://blog.csdn.net/qq_38219153/article/details/110894623

责任链模式

责任链模式的定义:
使多个对象都有机会处理请求,从而避免了请求发送者和请求接受者之间的耦合关系,将这些对象连城一条链,并沿着这条链传递请求,直到有对象处理它为止。

责任链模式涉及的角色:

  • Handler 抽象处理者:该角色对请求进行抽象,并定义一个方法以设定和返回对下一个处理者的引用
  • Concrete Handler 具体处理者:该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者
责任链模式的简单示例

202306152220331781.png

抽象处理者

抽象处理者一般采用抽象类,抽象类中有指向下一个抽象处理者的指针,并且定义在何种情况下会将请求转交到下一处理者,并且定义了请求处理的接口

    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);
    
    }

具体处理者

具体处理者主要完成对请求的处理

  1. 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();
    		
    	}
    
    }
  1. 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();
    		
    	}
    
    }

请求响应对象

  1. 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;
    	}
    	
    }
  1. 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] ,回复【面试题】 即可免费领取。

阅读全文