chain of responsibility模式

场景:

(1)现在在某一个地方的业务流程,要执行功能1、功能2、功能3 (2)现在在另外一个地方的业务流程,是要先执行功能3,然后执行功能1和功能2

1.常规

  1. package com.example.demo.pattern.chain;
  2. /**
  3. * @author chenchao
  4. * @date 2021/11/9
  5. */
  6. public class WithoutChainPatternDemo {
  7. public static void main(String[] args) {
  8. // 业务流程1
  9. System.out.println("执行功能1");
  10. System.out.println("执行功能2");
  11. System.out.println("执行功能3");
  12. // 业务流程2
  13. System.out.println("执行功能3");
  14. System.out.println("执行功能1");
  15. System.out.println("执行功能2");
  16. // 有什么问题?
  17. // 第一个,大量的重复代码出现了,功能123的代码,都出现在了两个地方,有复制粘贴的现象
  18. // 如果说,现在要对某个功能的代码进行修改,那么就会很麻烦,要在多个地方去修改这个功能的代码
  19. // 另外一个问题是说,如果现在要对某个业务流程的顺序进行调整或者改造,很麻烦,要去修改大量的代码
  20. }
  21. }

2.责任链模式

  1. package com.example.demo.pattern.chain;
  2. /**
  3. * @author chenchao
  4. * @date 2021/11/9
  5. */
  6. public class ChainPatternDemo {
  7. public static void main(String[] args) {
  8. // 业务流程1
  9. Handler thirdHandler = new Handler3(null);
  10. Handler secondHandler = new Handler2(thirdHandler);
  11. Handler firstHandler = new Handler1(secondHandler);
  12. firstHandler.execute();
  13. // 业务流程2
  14. thirdHandler = new Handler3(null);
  15. secondHandler = new Handler1(thirdHandler);
  16. firstHandler = new Handler2(secondHandler);
  17. firstHandler.execute();
  18. // 责任链的思想
  19. // 1:将一个业务流程中的多个步骤拆分开来,每个步骤封装到一个handler处理器中去
  20. // 2:支持业务流程基于handler动态组装,不同的业务流程 -> handler代表的代码组件可以复用
  21. // 好处1:将这个代码封装到一个handler中,后面如果要对某个步骤的代码逻辑调整,修改一个handler即可
  22. // 好处2:如果业务流程要修改,那么不需要拷贝大量的代码,只要基于handler动态组装业务流程即可
  23. // 面向的场景
  24. // 就是有多个业务流程,这些业务流程之间有相同的代码逻辑和步骤
  25. // 可以用责任链模式来实现
  26. }
  27. public static abstract class Handler {
  28. protected Handler successor;
  29. public Handler(Handler successor) {
  30. this.successor = successor;
  31. }
  32. public abstract void execute();
  33. }
  34. public static class Handler1 extends Handler {
  35. public Handler1(Handler successor) {
  36. super(successor);
  37. }
  38. @Override
  39. public void execute() {
  40. System.out.println("执行功能1");
  41. if(successor != null) {
  42. successor.execute();
  43. }
  44. }
  45. }
  46. public static class Handler2 extends Handler {
  47. public Handler2(Handler successor) {
  48. super(successor);
  49. }
  50. @Override
  51. public void execute() {
  52. System.out.println("执行功能2");
  53. if(successor != null) {
  54. successor.execute();
  55. }
  56. }
  57. }
  58. public static class Handler3 extends Handler {
  59. public Handler3(Handler successor) {
  60. super(successor);
  61. }
  62. @Override
  63. public void execute() {
  64. System.out.println("执行功能3");
  65. if(successor != null) {
  66. successor.execute();
  67. }
  68. }
  69. }
  70. }

3.说明

责任链模式,那也是经常会使用到的,对于那种复杂的业务流程,一种方案是采取面向对象的设计,将不同的业务逻辑封装到不同的类里去,然后通通过方法中的调用来控制业务流向;另外一种就是采用责任链模式,将业务逻辑封装到不同的handler里面去,形成链条式调用。

什么时候用责任链模式呢?很简单,就是如果你需要动态组装一个业务流程出来,流程中的每个handler业务逻辑需要复用,那就用责任链模式。