案例

学校OA系统的采购审批项目: 需求是
1) 采购员采购教学器材
2) 如果金额 小于等于5000, 由教学主任审批 (0<=x<=5000)
3) 如果金额 小于等于10000, 由院长审批 (50004) 如果金额 小于等于30000, 由副校长审批 (100005) 如果金额 超过30000以上,有校长审批 ( 30000<x)

传统方案

image.png

传统方式是:接收到一个采购请求后,根据采购金额来调用对应的Approver (审批
人)完成审批。
2) 传统方式的问题分析 : 客户端这里会使用到 分支判断(比如 switch) 来对不同的采
购请求处理, 这样就存在如下问题 (1) 如果各个级别的人员审批金额发生变化,在
客户端的也需要变化 (2) 客户端必须明确的知道 有多少个审批级别和访问
3) 这样 对一个采购请求进行处理 和 Approver (审批人) 就存在强耦合关系,不利于代
码的扩展和维护

职责链模式

职责链模式:为请求创建了一个接收者对象的的链。这种模式对请求的发送者和接收者进行解耦

职责链模式通常每一个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么他会把相同的请求传给下一个接收者,以此类推

image.png

image.png

Handler :抽象的处理者,定义了一个处理请求的方法,同时含有另外一个Handler对象
ConcreteHandlerA ,B 具体的处理者,处理自己负责的请求,还可以访问他的后继者,(即下一个处理者),
如果可以处理当前请求,则处理,否则交给后继者去处理,从而形成一个职责链

Request 有很多属性,表示一个请求

image.png

  1. //请求类
  2. public class PurchaseRequest {
  3. private int type = 0; //请求类型
  4. private float price = 0.0f; //请求金额
  5. private int id = 0;
  6. //构造器
  7. public PurchaseRequest(int type, float price, int id) {
  8. this.type = type;
  9. this.price = price;
  10. this.id = id;
  11. }
  12. public int getType() {
  13. return type;
  14. }
  15. public float getPrice() {
  16. return price;
  17. }
  18. public int getId() {
  19. return id;
  20. }
  21. }
  1. public abstract class Approver {
  2. Approver approver; //下一个处理者
  3. String name; // 名字
  4. public Approver(String name) {
  5. // TODO Auto-generated constructor stub
  6. this.name = name;
  7. }
  8. //下一个处理者
  9. public void setApprover(Approver approver) {
  10. this.approver = approver;
  11. }
  12. //处理审批请求的方法,得到一个请求, 处理是子类完成,因此该方法做成抽象
  13. public abstract void processRequest(PurchaseRequest purchaseRequest);
  14. }
  15. public class CollegeApprover extends Approver {
  16. public CollegeApprover(String name) {
  17. // TODO Auto-generated constructor stub
  18. super(name);
  19. }
  20. @Override
  21. public void processRequest(PurchaseRequest purchaseRequest) {
  22. // TODO Auto-generated method stub
  23. if(purchaseRequest.getPrice() < 5000 && purchaseRequest.getPrice() <= 10000) {
  24. System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
  25. }else {
  26. approver.processRequest(purchaseRequest);
  27. }
  28. }
  29. }
  30. public class DepartmentApprover extends Approver {
  31. public DepartmentApprover(String name) {
  32. // TODO Auto-generated constructor stub
  33. super(name);
  34. }
  35. @Override
  36. public void processRequest(PurchaseRequest purchaseRequest) {
  37. // TODO Auto-generated method stub
  38. if(purchaseRequest.getPrice() <= 5000) {
  39. System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
  40. }else {
  41. approver.processRequest(purchaseRequest);
  42. }
  43. }
  44. }
  45. public class SchoolMasterApprover extends Approver {
  46. public SchoolMasterApprover(String name) {
  47. // TODO Auto-generated constructor stub
  48. super(name);
  49. }
  50. @Override
  51. public void processRequest(PurchaseRequest purchaseRequest) {
  52. // TODO Auto-generated method stub
  53. if(purchaseRequest.getPrice() > 30000) {
  54. System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
  55. }else {
  56. approver.processRequest(purchaseRequest);
  57. }
  58. }
  59. }
  60. public class ViceSchoolMasterApprover extends Approver {
  61. public ViceSchoolMasterApprover(String name) {
  62. // TODO Auto-generated constructor stub
  63. super(name);
  64. }
  65. @Override
  66. public void processRequest(PurchaseRequest purchaseRequest) {
  67. // TODO Auto-generated method stub
  68. if(purchaseRequest.getPrice() < 10000 && purchaseRequest.getPrice() <= 30000) {
  69. System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
  70. }else {
  71. approver.processRequest(purchaseRequest);
  72. }
  73. }
  74. }
  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. //创建一个请求
  4. PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);
  5. //创建相关的审批人
  6. DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
  7. CollegeApprover collegeApprover = new CollegeApprover("李院长");
  8. ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校");
  9. SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校长");
  10. //需要将各个审批级别的下一个设置好 (处理人构成环形: )
  11. departmentApprover.setApprover(collegeApprover);
  12. collegeApprover.setApprover(viceSchoolMasterApprover);
  13. viceSchoolMasterApprover.setApprover(schoolMasterApprover);
  14. schoolMasterApprover.setApprover(departmentApprover);
  15. departmentApprover.processRequest(purchaseRequest);
  16. viceSchoolMasterApprover.processRequest(purchaseRequest);
  17. }