责任链模式:当客户提交请求时,请求会沿责任链传递,直至有一个对象负责处理它。当某个对象没有权限处理请求时,自动将处理转交上级

    优点:请求者不用管是哪个对象处理,最终请求一定会被处理

    实现:以普通员工申请请假和加薪为例,请假三天以内,经理处理;请假五天以内,加薪五百以内,总监处理;请假十天以内,加薪一千以内,大总监处理;请假超过十天,加薪超过一千,驳回申请
    1、请求类

    1. /**
    2. * 请求类
    3. */
    4. public class Request {
    5. //请求方式
    6. private String requestType;
    7. //请求数量
    8. private Integer requestNumber;
    9. public String getRequestType() {
    10. return requestType;
    11. }
    12. public void setRequestType(String requestType) {
    13. this.requestType = requestType;
    14. }
    15. public Integer getRequestNumber() {
    16. return requestNumber;
    17. }
    18. public void setRequestNumber(Integer requestNumber) {
    19. this.requestNumber = requestNumber;
    20. }
    21. }

    2、处理类

    1. /**
    2. * 抽象管理者类
    3. */
    4. public abstract class Manager {
    5. //名称
    6. String name;
    7. //上级管理者
    8. Manager superior;
    9. public Manager(String name){
    10. this.name = name;
    11. }
    12. /**
    13. * 设置上级管理者
    14. */
    15. public abstract void setSuperior(Manager manager);
    16. public abstract void handleRequest(Request request);
    17. }
    18. /**
    19. * 经理
    20. */
    21. public class CommonManager extends Manager{
    22. public CommonManager(String name){
    23. super(name);
    24. }
    25. /**
    26. * 设置上级管理者
    27. */
    28. public void setSuperior(Manager manager){
    29. super.superior = manager;
    30. }
    31. /**
    32. * 有权限执行则执行,没有权限则向上提交
    33. */
    34. public void handleRequest(Request request){
    35. if ("请假".equals(request.getRequestType()) && request.getRequestNumber() <= 3){
    36. System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));
    37. }else{
    38. System.out.println(MessageFormat.format("{0}:无权审批",name));
    39. superior.handleRequest(request);
    40. }
    41. }
    42. }
    43. /**
    44. * 总监
    45. */
    46. public class Majordomo extends Manager{
    47. public Majordomo(String name){
    48. super(name);
    49. }
    50. /**
    51. * 设置上级管理者
    52. */
    53. public void setSuperior(Manager manager){
    54. super.superior = manager;
    55. }
    56. /**
    57. * 有权限执行则执行,没有权限则向上提交
    58. */
    59. public void handleRequest(Request request){
    60. if ("请假".equals(request.getRequestType()) && request.getRequestNumber() <= 5){
    61. System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));
    62. }else if ("加薪".equals(request.getRequestType()) && request.getRequestNumber() <= 500){
    63. System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));
    64. }else{
    65. System.out.println(MessageFormat.format("{0}:无权审批",name));
    66. superior.handleRequest(request);
    67. }
    68. }
    69. }
    70. /**
    71. * 大总监
    72. */
    73. public class GeneralManager extends Manager{
    74. public GeneralManager(String name){
    75. super(name);
    76. }
    77. /**
    78. * 设置上级管理者
    79. */
    80. public void setSuperior(Manager manager){
    81. super.superior = manager;
    82. }
    83. /**
    84. * 有权限执行则执行,没有权限则驳回
    85. */
    86. public void handleRequest(Request request){
    87. if ("请假".equals(request.getRequestType()) && request.getRequestNumber() <= 10){
    88. System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));
    89. }else if ("加薪".equals(request.getRequestType()) && request.getRequestNumber() <= 1000){
    90. System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));
    91. }else{
    92. System.out.println(MessageFormat.format("{0}:驳回申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));
    93. }
    94. }
    95. }

    3、测试类

    1. /**
    2. * 测试责任链模式
    3. */
    4. public class TestResponsibilityChain {
    5. public static void main(String [] args){
    6. Request request = new Request();
    7. request.setRequestType("请假");
    8. request.setRequestNumber(5);
    9. Manager commonManager = new CommonManager("张三经理");
    10. Manager majordomo = new Majordomo("李四总监");
    11. Manager generalManager = new GeneralManager("王五大总监");
    12. commonManager.setSuperior(majordomo);
    13. majordomo.setSuperior(generalManager);
    14. commonManager.handleRequest(request);
    15. }
    16. }

    测试结果:
    image.png

    责任链模式是当系统中有大量分支判断时,需要用到的模式