定义
责任链模式属于行为模式,为请求创建了一个接收者对象的链,这种模式给于请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依次类推。或者如果某个接收者处理完之后,还需要传递到下一个接收者继续处理或者返回处理完毕
主要解决
职责链上的处理者与接收者耦合在一起,让多个对象都有可能接收到请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
优点
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不知道链的结构。
- 增加给对象指派的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调式是不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
使用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时间时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可以动态指定一组对象处理请求。
示例
场景
小明所在的公司,请假需要领导进行审批,如果请假天数半天到1天,需要主管审批,如果请假1到3天,主管审批完之后,还需要部门经理审批。请假3到30天的,主管和部门经历审批完之后,还需要总经理进行处理。
角色
- 员工请求的类:LeaveRequest
- 抽象的责任处理类:AbstractHandler
- 主管审批的处理类:DirectLeaderHandler
- 部门经理处理类:DeptManagerHandler
- 总经理处理类:GManagerHandler
UML类图
image.png实现步骤
- 定义一个抽象的责任处理类AbstractHandler,定义一个抽象方法 handlerRequest的作用是用来处理请求的。定义一个设置下级的处理者。
public abstract class AbstractHandler {
/**
* 需主管审批的天数
*/
protected final static int MIN=1;
/**
* 需部门经理审批的天数
*/
protected final static int MIDDLE=3;
/**
* 需总经理历审批的天数
*/
protected final static int MAX=30;
protected AbstractHandler nextHandler;
/**
* 设置下一个审批者
* @param nextHandler
*/
protected void setNextHandler(AbstractHandler nextHandler) {
this.nextHandler = nextHandler;
}
/**
* 需要子类进行重写
* @param request
*/
public abstract void handlerRequest(LeaveRequest request);
}
- 定义主管审批的处理类:DirectLeaderHandler
public class DirectLeaderHandler extends AbstractHandler {
@Override
public void handlerRequest(LeaveRequest request) {
if(request.getLeaveDays()<=MIN){
System.out.println("部门主管:已审批 请假申请通过");
return;
}
//请假天数大于1天,需要继续传递到部门经理进行审批
if (request.getLeaveDays()> MIN){
if(nextHandler!=null){
System.out.println("部门主管:已审批 还需要部门经理审批");
nextHandler.handlerRequest(request);
}
}
}
}
- 定义部门经理:DeptManagerHandler
public class DeptManagerHandler extends AbstractHandler{
@Override
public void handlerRequest(LeaveRequest request) {
if(request.getLeaveDays()<=MIDDLE){
System.out.println("部门经理:已审批 请假申请通过");
return;
}
//请假天数大于3天,需要继续传递到总经理进行审批
if (request.getLeaveDays()> MIDDLE){
if(nextHandler!=null){
System.out.println("部门经理:已审批 还需要总经理审批");
nextHandler.handlerRequest(request);
}
}
}
}
- 定义总经理处理类:GManagerHandler
public class GManagerHandler extends AbstractHandler{
@Override
public void handlerRequest(LeaveRequest request) {
if(request.getLeaveDays()<=MAX){
System.out.println("总经理:已审批 请假申请通过");
return;
}
//如果大于30天的,根据具体的需要进行处理
if (request.getLeaveDays()> MAX){
}
}
}
- 定义员工请求的类:LeaveRequest
/**
* 请假的请求类
*/
public class LeaveRequest {
/**
* 请假的天数
*/
private int leaveDays;
/**
* 请假人的名字
*/
private String name;
public LeaveRequest leaveDays(int days){
this.leaveDays=days;
return this;
}
public LeaveRequest name(String name){
this.name=name;
return this;
}
public int getLeaveDays() {
return leaveDays;
}
public String getName() {
return name;
}
}
- 具体的使用
public static void main(String[] args){
GManagerHandler gManagerHandler=new GManagerHandler();
DirectLeaderHandler directLeaderHandler=new DirectLeaderHandler();
DeptManagerHandler deptManagerHandler=new DeptManagerHandler();
deptManagerHandler.setNextHandler(gManagerHandler);
directLeaderHandler.setNextHandler(deptManagerHandler);
LeaveRequest request=new LeaveRequest().leaveDays(18).name("小明");
System.out.println(request.getName()+"发起请"+request.getLeaveDays()+"天假的申请");
directLeaderHandler.handlerRequest(request);
LeaveRequest request2=new LeaveRequest().leaveDays(1).name("小红");
System.out.println(request2.getName()+"发起请"+request2.getLeaveDays()+"天假的申请");
directLeaderHandler.handlerRequest(request2);
LeaveRequest request3=new LeaveRequest().leaveDays(2).name("小亮");
System.out.println(request3.getName()+"发起请"+request3.getLeaveDays()+"天假的申请");
directLeaderHandler.handlerRequest(request3);
}
结果:
小明发起请18天假的申请
部门主管:已审批 还需要部门经理审批
部门经理:已审批 还需要总经理审批
总经理:已审批 请假申请通过
小红发起请1天假的申请
部门主管:已审批 请假申请通过
小亮发起请2天假的申请
部门主管:已审批 还需要部门经理审批
部门经理:已审批 请假申请通过
网友评论