美文网首页
Java设计模式——责任链模式

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

作者: 132xin | 来源:发表于2020-11-18 20:03 被阅读0次

    定义

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

    主要解决

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

    优点

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

    缺点

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

    使用场景

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

    示例

    场景

    小明所在的公司,请假需要领导进行审批,如果请假天数半天到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设计模式——责任链模式

          本文链接:https://www.haomeiwen.com/subject/gdyciktx.html