责任链模式---遇上对的人

        声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333
        在公司中费用的审批是一件很严格的事情,每个审批人可审批的最大额度都是不一致的,超过最大额度,只能交给上级审批。
    而每次进行费用审批,如果都能知道相应的审批人,则可以大大的节省审批时间。所以在对的时间遇上对的人就尤为重要,
    而责任链模式则可以使之变得可能。
/**
 * @introduce:抽象审批人
 * 
 */
public abstract class Approver {
    private Approver approver;
    //级别
    private int level;
    //审批上限费用
    private int maxChange;
    //审批下限费用(避免所以申请都找最高级的审批)
    private int minChange;

    public Approver(int level, int maxChange, int minChange) {
        this.level = level;
        this.maxChange = maxChange;
        this.minChange = minChange;
    }

    public void setApprover(Approver approver) {
        this.approver = approver;
    }

    protected int getLevel() {
        return this.level;
    }

    public final void handleMessage(int cost) {
        if (this.minChange <= cost && cost < this.maxChange) {
            echo(cost);
        } else {
            if (this.approver != null) {
                this.approver.handleMessage(cost);
            } else {
                System.out.println("没人有权限审批" + cost + "这个费用,请直接沟通老板");
            }
        }
    }

    public abstract void echo(int cost);
}
/**
 * @introduce:第一个级别的审批人
 * 
 */
public class FirstLevelApprover extends Approver {

    public FirstLevelApprover(int level, int maxChange, int minChange) {
        super(level, maxChange, minChange);
    }

    @Override
    public void echo(int cost) {
        System.out.println("审批费用是:" + cost + "对应的级别是" + this.getLevel() + "请去找相应的负责人A");
    }

}
/**
 * @introduce:第二个级别审批人
 * 
 */
public class SecondLevelApprover extends Approver {

    public SecondLevelApprover(int level, int maxChange, int minChange) {
        super(level, maxChange, minChange);
    }

    @Override
    public void echo(int cost) {
        System.out.println("审批费用是:" + cost + "对应的级别是" + this.getLevel() + "请去找相应的负责人B");
    }

}
/**
 * @introduce:第三个级别审批人
 * 
 */
public class ThirdLevelApprover extends Approver {

    public ThirdLevelApprover(int level, int maxChange, int minChange) {
        super(level, maxChange, minChange);
    }

    @Override
    public void echo(int cost) {
        System.out.println("审批费用是:" + cost + "对应的级别是" + this.getLevel() + "请去找相应的负责人C");
    }
}
/**
 * @introduce:第四个级别审批人
 * 
 */
public class FourLevelApprover extends Approver {

    public FourLevelApprover(int level, int maxChange, int minChange) {
        super(level, maxChange, minChange);
    }

    @Override
    public void echo(int cost) {
        System.out.println("审批费用是:" + cost + "对应的级别是" + this.getLevel() + "请去找相应的负责人D");
    }

}
/**
 * @introduce:审批人管理类
 * 
 */
public class ApproverManager {
    private static ApproverManager manager = new ApproverManager();

    private Approver head;
    private Approver last;

    private ApproverManager() {
        init();
    }

    public static ApproverManager getInstance() {
        return manager;
    }

    private void init() {
        Approver first = new FirstLevelApprover(1, 2000, 0);
        Approver second = new SecondLevelApprover(2, 5000, 2000);
        Approver third = new ThirdLevelApprover(3, 10000, 5000);
        Approver four = new FourLevelApprover(4, 30000, 10000);
        invoke(second);
        invoke(first);
        invoke(third);
        invoke(four);
    }

    private void invoke(Approver approver) {
        if (head == null) {
            head = last = approver;
        } else {
            last.setApprover(approver);
            last = approver;
        }
    }

    public void handleCost(int cost) {
        head.handleMessage(cost);
    }
}
/**
 * @introduce:测试类
 * 
 */
public class Client {
    public static void main(String[] args) {
        ApproverManager.getInstance().handleCost(1000);
        ApproverManager.getInstance().handleCost(2300);
        ApproverManager.getInstance().handleCost(5200);
        ApproverManager.getInstance().handleCost(12000);
        ApproverManager.getInstance().handleCost(45000);
    }
}

输出结果:
审批费用是:1000对应的级别是1请去找相应的负责人A
审批费用是:2300对应的级别是2请去找相应的负责人B
审批费用是:5200对应的级别是3请去找相应的负责人C
审批费用是:12000对应的级别是4请去找相应的负责人D
没人有权限审批45000这个费用,请直接沟通老板

    从结果中可以看到只要输入相应的费用信息,就可以马上定位到要找的相应负责人。大大节省了整个审批流程的时间,这就是责任链
模式。责任链模式显著的优点就是将请求和处理分开,请求者可以不用知道是谁处理的,处理这可以不用知道请求的全貌,两者解耦,提
高系统的灵活性。有优点就有相应的缺点:一是性能问题,每个请求都是从链头遍历到链尾,在链比较长的时候,会大大损耗性能。二是
不方便调试,特别是链长的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。
    参考大牛博客:http://www.cnblogs.com/zuoxiaolong/p/pattern21.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值