chain of responsibility模式

    场景:

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

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

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

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