来公司快一年了终于可以去出差了,出差回来就是写出差报销流程。公司规定报销金额小于3000直属领导可以批,大于3000小于10000部门领导可以批,大于10000需要boss才能批(每个公司不一样),下面用程序猿的语言来描述这个流程。
程序猿:
public class Programer { private int money; private String request ="出差报销"; public Programer(int money) { this.money = money; } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } /* * 获取差旅费申请 */ public String getApply() { return request; } }直属领导:
public class GroupLeader { public void handleRequest(Programer p) { System.out.println(p.getApply()); System.out.println("groupleader is ok"); } }部门经理:
public class Manager { public void handleRequest(Programer p) { System.out.println(p.getApply()); System.out.println("manager is ok"); } }老板Boss:
public class Boss { public void handleRequest(Programer p) { System.out.println(p.getApply()); System.out.println("boss is ok"); } }场景类:
public class Client { public static void main(String[] args) { Programer p = new Programer(4000); GroupLeader leader = new GroupLeader(); Manager manager = new Manager(); Boss boss = new Boss(); if(p.getMoney()>1000) { leader.handleRequest(p); }else if (p.getMoney()<10000) { manager.handleRequest(p); }else { boss.handleRequest(p); } } }报销流程结果:
出差报销 groupleader is ok整个报销流程走完了,我们发现这段代码太粗糙了,审批流程的过程应该由领导自己来完成,而不是放在场景类中。我们把领导抽象出来,让流程审批逻辑由领导自己审批,改造后代码如下所示:
抽象领导类:
public abstract class Leader { private int money;//领导能批的最大金额 private Leader supLeader;//上级领导 public Leader(int money) { this.money = money; } public void setSupLeader(Leader supLeader) { this.supLeader = supLeader; } public void handleRequest(Programer p) { if(p.getMoney()<=this.money) { apply(p); }else { if(supLeader!=null) { supLeader.apply(p); }else{ System.out.println("流程出错,审批失败"); } } } public abstract void apply(Programer p);//批流程 }直属领导:
public class GroupLeader extends Leader { public GroupLeader() { super(3000); // TODO Auto-generated constructor stub } @Override public void apply(Programer p) { System.out.println(p.getApply()); System.out.println("groupLeader is ok"); } }部门经理:
public class Manager extends Leader { public Manager() { super(10000); // TODO Auto-generated constructor stub } @Override public void apply(Programer p) { System.out.println(p.getApply()); System.out.println("manager is ok"); } }老板boss:
public class Boss extends Leader { public Boss() { super(10000); // TODO Auto-generated constructor stub } @Override public void apply(Programer p) { // TODO Auto-generated method stub System.out.println(p.getApply()); System.out.println("boss is ok"); } }程序猿:
public class Programer { private int money; private String request ="出差报销"; public Programer(int money) { this.money = money; } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } /* * 获取差旅费申请 */ public String getApply() { return request; } }场景类:
public class Client { public static void main(String[] args) { Programer programer = new Programer(4000); GroupLeader groupLeader = new GroupLeader(); Manager manager = new Manager(); Boss boss = new Boss(); groupLeader.setSupLeader(manager); manager.setSupLeader(boss); groupLeader.handleRequest(programer); } }流程审批结果:
public class Client { public static void main(String[] args) { Programer programer = new Programer(4000); GroupLeader groupLeader = new GroupLeader(); Manager manager = new Manager(); Boss boss = new Boss(); groupLeader.setSupLeader(manager); manager.setSupLeader(boss); groupLeader.handleRequest(programer); } }结果是一样的,我们场景类里只是给领导设置了上级领导就可以完成整个报销流程的审批。流程请求和流程处理完全分开,程序猿不需要知道是谁审批了这个流程,尽管收钱就好,这就是责任链模式。
责任链模式定义 责任链模式:Avoid couping the sender of a request to its receiver by giving more than one object a chance to handle the quest. Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求类,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止)。
责任链模式的优点 责任链模式将请求和处理分开,请求者可以不知道处理者是谁,处理者也不用知道请求者是谁。 责任链模式的缺点 性能问题,每个请求都是从链头遍历到尾,责任链如果很长时,性能就是一个大问题。
责任链在Android中的使用 Android中view的事件分发就是使用了责任链模式。