频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
行为型设计模式之责任链模式
2017-03-03 09:37:19         来源:Zerone1993  
收藏   我要投稿

行为型设计模式之责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止(如果权限不够则直接跳转)。

责任链模式参与角色:

抽象处理者角色定义一个处理请求的接口,和一个后继连接(可选)

具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,
如果可以处理请求则处理,否则将该请求转给他的后继者。

客户类(Client):向一个链上的具体处理者ConcreteHandler对象提交请求。

抽象处理者角色:Approver

package com.zhiwei.responsibility;

public abstract class Approver {

    /**上级领导*/
    private Approver leader;

    public abstract void approve(BorrowBill borrowBill);

    public Approver getLeader() {
        return leader;
    }

    /**
     * 设置上一级领导:设置继任者
     * @param leader
     */
    public void setLeader(Approver leader) {
        this.leader = leader;
    }
}

具体处理者角色:ConcreteHandler

package com.zhiwei.responsibility;

/**
 * 员工类:提出收支单审批申请
 * @author Yang ZhiWei
 *
 */
public class EmployeeApprover extends Approver{

    @Override
    public void approve(BorrowBill borrowBill) {
            System.out.println("员工向部门主管申请审批借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
            super.getLeader().approve(borrowBill);
    }

}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:公司董事长
 * 权限:<5000
 * @author Yang ZhiWei
 *
 */
public class DepartmentApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() < 5000d) {
            System.out.println("员工部门主管审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("员工部门主管权限不够,提交上一级领导审批................");
            super.getLeader().approve(borrowBill);
        }
    }
}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:财务部门经理
 * @author Yang ZhiWei
 *
 */
public class FinanceApprover extends Approver {

     public void approve(BorrowBill borrowBill) {
            if (borrowBill.getSum() >= 5000d && borrowBill.getSum() < 20000d) {
                System.out.println("财务部门经理审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
            } else if (super.getLeader() != null) {
                System.out.println("财务部门经理权限不够,提交上一级领导审批................");
                super.getLeader().approve(borrowBill);
            }
        }
}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:公司总经理
 * 权限:2000~50000
 * @author Yang ZhiWei
 *
 */
public class ManagerApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() >= 20000d && borrowBill.getSum() < 50000d) {
            System.out.println("公司总经理审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("公司总经理权限不够,提交上一级领导审批................");
            super.getLeader().approve(borrowBill);
        }
    }
}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:公司董事长
 * 权限:>=50000
 * @author Yang ZhiWei
 *
 */
public class ChairmanApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() >= 50000d) {
            System.out.println("公司董事长审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("公司董事长没有上级了");
        }
    }
}

测试代码:

//设置具体的处理者
Approver employeeApprover = new EmployeeApprover();
Approver departApprover = new DepartmentApprover();
Approver financeApprover = new FinanceApprover();
Approver managerApprover = new ManagerApprover();
Approver chairmanApprover = new ChairmanApprover();

//配置处理者之间的关系:配置上下级的关系
employeeApprover.setLeader(departApprover);
departApprover.setLeader(financeApprover);
financeApprover.setLeader(managerApprover);
managerApprover.setLeader(chairmanApprover);

//设置借支单
BorrowBill borrowBill = new BorrowBill();
borrowBill.setName("出差借支单");
borrowBill.setSum(3000d);

//执行处理流程:根据不同的情况,责任链角色根据权限的不同分别处理
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");

borrowBill.setName("出差借支单");
borrowBill.setSum(6000d);
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");
borrowBill.setName("采购办公用品借支单");
borrowBill.setSum(15000d);
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");
borrowBill.setName("采购原料借支单");
borrowBill.setSum(45000d);
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");
borrowBill.setName("采购原料借支单");
borrowBill.setSum(100000d);
employeeApprover.approve(borrowBill);

结果:
这里写图片描述

解释

责任链设计模式的核心就是”一步到位“处理

例如公司请假规定:
①:7天之内,主管批准即可
②:15天之内,经理批准即可
③:>15天,总经理批准即可
这里①,②,③就是责任链设计模式中的执行者,员工请假根据自己的情况依次提交主管,主管判断情况进行任务处理或任务转交给上级处理,这样不会像状态模式一样,如果卡在一个环节就无法走下去了,而责任链设计模式则可以一步到位处理。

点击复制链接 与好友分享!回本站首页
上一篇:工厂模式学习笔记
下一篇:分布式服务框架之服务路由
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站