模板方法模式(Template Method Pattern)又叫作模板模式,指定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于行为型设计模式。

    在父类中封装一个固定的流程,该流程由几个步骤组成,公共行为提取到父类实现,由子类实现可变的步骤。
    模板方法(流程)定义为final,避免子类覆写

    image.png
    抽象模板类,定义流程框架,实现公共行为
    具体实现类,对某些步骤进行实现

    1. package com.company.template;
    2. public abstract class AbstractClass {
    3. protected void step1(){
    4. System.out.println("default1");
    5. }
    6. protected void step2(){
    7. System.out.println("default2");
    8. }
    9. protected void step3(){
    10. System.out.println("default3");
    11. }
    12. protected boolean needStep3(){
    13. return false;
    14. }
    15. public final void templateMethod(){
    16. this.step1();
    17. this.step2();
    18. if(needStep3()) {
    19. this.step3();
    20. }
    21. }
    22. static class ConcreteClassA extends AbstractClass{
    23. @Override
    24. protected void step1() {
    25. System.out.println("A1");
    26. }
    27. @Override
    28. protected void step2() {
    29. System.out.println("A1");
    30. }
    31. @Override
    32. protected void step3() {
    33. System.out.println("A1");
    34. }
    35. }
    36. static class ConcreteClassB extends AbstractClass{
    37. @Override
    38. protected void step1() {
    39. System.out.println("B1");
    40. }
    41. @Override
    42. protected void step2() {
    43. System.out.println("B1");
    44. }
    45. @Override
    46. protected void step3() {
    47. System.out.println("B1");
    48. }
    49. // 钩子方法,干预流程
    50. @Override
    51. protected boolean needStep3() {
    52. return true;
    53. }
    54. }
    55. }

    可以使用钩子方法干预流程

    框架

    • Mybatis的BaseExecutor
    • AbstractList

    优点:

    • 公用的处理逻辑放在抽象父类中,提高代码复用性,符合开闭原则
    • 子类覆写步骤改变行为,可扩展性强