一、介绍:
1、定义:责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。在责任链模式中,当一个对象无法处理请求时,它会将请求传递给链中的下一个对象,直到找到能够处理请求的对象为止。这种方式可以动态地组织和管理对象,使得请求发送者和接收者之间解耦,提高系统的灵活性和可扩展性。
2、组成结构:
(1)抽象处理者(Handler):定义了一个处理请求的接口,包含抽象处理方法和一个后继连接。
(2)具体处理者(ConcreteHandler):实现抽象处理者接口,具体处理请求的逻辑。如果可以处理请求,则处理请求;否则,将请求传递给下一个处理者。
(3)客户类:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
二、demo:
1、请假:<=3天组长审批;>3且<=5天hr审批再组长审批;>5天hr审批再组长审批再总监审批。
封装请求类:
public class LeaveRequest {
private String reason;
private Integer day;
private String starter;
LeaveRequest(Integer day,String starter){
this.day = day;
this.starter = starter;
}
/**省略所有set、get方法*/
}
(1)抽象管理者
public abstract class Manager {
public String userName;
Manager superior;
public Manager(String userName){
this.userName = userName;
}
public void setSuperior(Manager superior){
this.superior = superior;
}
public void handle(LeaveRequest leaveRequest){};
}
(2)具体管理者:
//组长
public class ZzManeger extends Manager {
public ZzManeger(String userName) {
super(userName);
}
@Override
public void handle(LeaveRequest leaveRequest) {
if(leaveRequest.getDay() <= 3){
System.out.println("请假时长小于3天,组长直接审批");
}else if(superior != null){
superior.handle(leaveRequest);
}
}
}
//hr
public class HrManeger extends Manager {
public HrManeger(String userName) {
super(userName);
}
@Override
public void handle(LeaveRequest leaveRequest) {
Integer day = leaveRequest.getDay();
if(day> 3 && day <=5){
System.out.println("请假时长大于3小于5天,HR审批");
System.out.println("HR审批完下一级审批");
if(superior != null) {
superior.handle(leaveRequest);
}
}else if(day >5 && superior != null){
superior.handle(leaveRequest);
}
}
}
//总监
public class ZjManeger extends Manager {
public ZjManeger(String userName) {
super(userName);
}
@Override
public void handle(LeaveRequest leaveRequest) {
System.out.println("总监审批");
}
}
(3)客户端:
public class Test {
public static void main(String args[]){
//链设置,组长-->hr-->总监
Manager zz = new ZzManeger("组长张三");
Manager hr = new HrManeger("hr李四");
Manager zj = new ZjManeger("总王五");
zz.setSuperior(hr);
hr.setSuperior(zj);
//请假,从自己最近的上级即组长请求
//1、<=3天
LeaveRequest leaveRequest = new LeaveRequest(3,"发起人");
zz.handle(leaveRequest);
System.out.println("*********************");
//2、>3 <=5天
leaveRequest.setDay(5);
zz.handle(leaveRequest);
System.out.println("*********************");
//3、>5天
leaveRequest.setDay(7);
zz.handle(leaveRequest);
}
}
输出:
请假时长小于3天,组长直接审批
*********************
请假时长大于3小于5天,HR审批
HR审批完下一级审批
总监审批
*********************
总监审批