十三、责任链模式

  • 目的 : 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
  • 核心 : 定义处理者接口(含处理方法和设置后继者的方法)。每个具体处理者判断自己能否处理请求,不能则转发给后继者。
  • 场景 :适用于多级审批流程,如请假申请和报销审批。

首先有一个抽象处理者,声明了若干个处理方法

java 复制代码
package chainofresponsibility;

public abstract class Filter {

	private Filter successor;

	public void setSuccessor(Filter successor){
		this.successor = successor;		// 设置下一个过滤器
	}

	public Filter getSuccessor(){		// 用以判断是否有下一个过滤器
		return successor;
	}

	public abstract void handleFilter();

	public abstract void handleFilter2();
}

具体处理者,实现了若干个具体处理方法

java 复制代码
package chainofresponsibility;

public class ConcreteFilter extends Filter {

	private String name;

	public ConcreteFilter(String name) {
		this.name = name;
	}

	@Override
	public void handleFilter() {
		System.out.println(name + " 处理请求");
		if(getSuccessor() != null){			// 如果过滤器实例不为空
			getSuccessor().handleFilter();  // 递归,所有的过滤器都要处理
		}
	}

	@Override
	public void handleFilter2() {
		if(getSuccessor() != null){
			getSuccessor().handleFilter2();
		}else{
			// 最后一个过滤器处理请求
			System.out.println(name + " 处理请求");
		}
	}
}

最后是函数入口

java 复制代码
package chainofresponsibility;

public class MainTest {
	public static void main(String[] args) {

		// 创建过滤器
		Filter filter1 = new ConcreteFilter("村长");
		Filter filter2 = new ConcreteFilter("镇长");
		Filter filter3 = new ConcreteFilter("区长");
		Filter filter4 = new ConcreteFilter("市长");

		// 构建责任链
		filter1.setSuccessor(filter2);
		filter2.setSuccessor(filter3);
		filter3.setSuccessor(filter4);

		System.out.println("-----通过每一个过滤器,包括最后一个,顺序也是一次一次的处理----");
		filter1.handleFilter();

		System.out.println("----现在是交给最后一个过滤器处理----");
		filter1.handleFilter2();
	}
}

终端输出:

复制代码
-----依次通过每一个过滤器处理----
村长 处理请求
镇长 处理请求
区长 处理请求
市长 处理请求
-----直接给最后一个过滤器处理----
市长 处理请求
相关推荐
paopaokaka_luck27 分钟前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir28 分钟前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人41 分钟前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521591 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐3 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾3 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者3 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯3 小时前
啊啊啊啊啊
java·服务器·数据库
SL_staff4 小时前
运维救火实战:钉钉API变更致薪资计算中断,如何用可视化逻辑引擎5分钟热修复
java·开源·全栈
猫猫.1534 小时前
HashTable、HashMap、ConcurrentHashMap 核心区别总结
java·开发语言·java-ee