Java设计模式——责任链模式

定义

责任链模式属于行为模式,为请求创建了一个接收者对象的链,这种模式给于请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依次类推。或者如果某个接收者处理完之后,还需要传递到下一个接收者继续处理或者返回处理完毕

主要解决

职责链上的处理者与接收者耦合在一起,让多个对象都有可能接收到请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

优点

  • 降低耦合度。它将请求的发送者和接收者解耦。
  • 简化了对象。使得对象不知道链的结构。
  • 增加给对象指派的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 增加新的请求处理类很方便。

缺点

  • 不能保证请求一定被接收。
  • 系统性能将受到一定影响,而且在进行代码调式是不太方便,可能会造成循环调用。
  • 可能不容易观察运行时的特征,有碍于除错。

使用场景

  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时间时刻自动确定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可以动态指定一组对象处理请求。

示例

场景

小明所在的公司,请假需要领导进行审批,如果请假天数半天到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天假的申请
部门主管:已审批 还需要部门经理审批
部门经理:已审批 请假申请通过

参考连接:
https://www.jianshu.com/p/9f7d9775bdda

你可能感兴趣的:(Java设计模式——责任链模式)