概念: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链; 当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止.
分类: 属于对象行为型模式
主要角色:
抽象处理者(Handler)角色:
定义一个处理请求的方法,包含抽象处理方法和一个后继连接
具体处理者(Concrete Handler)角色:
实现抽象处理者的处理方法,判断能否处理本次请求, 如果可以处理请求就进行处理,否则将请求转给它的后继者
客户类(Client)角色:
创建处理链
使用一个简单的请假流程,涉及到多级审批,来演示使用责任链的流程
责任链模式UML类图
/**
* 审批者抽象类
*/
@Data
public abstract class ApproveHandler {
ApproveHandler next;
// 指定下一个处理者
public void setNext(ApproveHandler next) {
this.next = next;
}
// 处理业务的方法
public abstract void doHandler(int size);
}
/**
* 审批者1 - 小组长
*/
public class GroupLeaderApproveHandler extends ApproveHandler{
@Override
public void doHandler(int size) {
if (size <= 1) {
System.out.println("组长审批通过!");
return;
}
if (next != null) {
next.doHandler(size);
}
}
}
/**
* 审批者2 - 部门经理
*/
public class DepartLeaderApproveHandler extends ApproveHandler{
@Override
public void doHandler(int size) {
if (size <= 3) {
System.out.println("部门经理审批通过!");
return;
}
if (next != null) {
next.doHandler(size);
}
}
}
/**
* 审批者3 - CTO
*/
public class CTOApproveHandler extends ApproveHandler {
@Override
public void doHandler(int size) {
if (size <= 5) {
System.out.println("CTO审批通过!");
return;
}
if (next != null) {
System.out.println("请假不予通过");
}
}
}
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
int size = 5;
ApproveHandler groupLeaderHandler = new GroupLeaderApproveHandler();
ApproveHandler departLeaderHandler = new DepartLeaderApproveHandler();
ApproveHandler ctoHandler = new CTOApproveHandler();
groupLeaderHandler.setNext(departLeaderHandler);
departLeaderHandler.setNext(ctoHandler);
groupLeaderHandler.doHandler(size);
}
}
责任链模式在源码中的使用案例分析: