声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我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