基本介绍:

    1. 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
    2. 简单来说,模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
    3. 这种类型的设计模式属于行为型模式

    模板模式类图:
    image.png

    模板模式角色及职责:

    1. AbstractClass抽象类,类中实现了模板方法,定义了算法的骨架,具体子类需要去实现其他的抽象方法
    2. ConcreteClass实现抽象方法,以完成算法中特点子类的步骤

    代码示例:

    1. public abstract class SoyaMilk {
    2. /**
    3. * 固定方法,不让子类覆盖
    4. */
    5. final void make(){
    6. this.select();
    7. this.addCondiments();
    8. System.out.println("--制作");
    9. }
    10. void select(){
    11. System.out.println("--选材");
    12. }
    13. /**
    14. * 抽象方法,让子类实现
    15. */
    16. abstract void addCondiments();
    17. }
    18. public class RedBeanSoyaMilk extends SoyaMilk {
    19. @Override
    20. void addCondiments() {
    21. System.out.println("--添加红豆");
    22. }
    23. }
    24. public class PeanutSoyaMilk extends SoyaMilk {
    25. @Override
    26. void addCondiments() {
    27. System.out.println("--添加花生");
    28. }
    29. }
    30. public class Client {
    31. public static void main(String[] args) {
    32. RedBeanSoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
    33. redBeanSoyaMilk.make();
    34. PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
    35. peanutSoyaMilk.make();
    36. }
    37. }

    模板模式的钩子方法: 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。例如上述代码例子中抽象类的select()方法就是“钩子”可以是情况覆盖。

    模板模式注意事项和细节:

    1. 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
    2. 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用
    3. 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现
    4. 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
    5. 一般模板方法都加上 final 关键字,防止子类重写模板方法
    6. 模板方法模式使用场景:当要完成某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理