设计模式之模板模式

81 阅读2分钟

一、基本概念

  • 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern)。在一个抽象类中定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用该将以抽象类中定义的方式进行。
  • 模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。
  • 这种类型的设计模式属于行为型模式

二、案例

  • 制作豆浆的步骤都一样,但是每个步骤的内容不一样。可以通过模板方法模式实现 在这里插入图片描述
public abstract class SoyaMilk {
  public void make() {
    select();
    soak();
    add();
    beat();
  }
  /**
   * 挑选物料
   */
  abstract void select();
  /**
   * 浸泡物料
   */
  abstract void soak();

  /**
   * 添加物料
   */
  abstract void add();
  /**
   * 研磨物料
   */
  abstract void beat();
}
public class RedBeanSoyaMilk extends SoyaMilk {
  @Override
  public void select() {
    System.out.println("挑选上好的红豆");
  }

  @Override
  public void soak() {
    System.out.println("浸泡红豆一段时间");
  }

  @Override
  public void add() {
    System.out.println("将红豆添加到研磨器");
  }

  @Override
  public void beat() {
    System.out.println("开始研磨红豆");
  }
}
public class BlackBeanSoyaMilk extends SoyaMilk {
  @Override
  public void select() {
    System.out.println("挑选上好的黑豆");
  }

  @Override
  public void soak() {
    System.out.println("浸泡黑豆一段时间");
  }

  @Override
  public void add() {
    System.out.println("将黑豆添加到研磨器");
  }

  @Override
  public void beat() {
    System.out.println("开始研磨黑豆");
  }
}
public class Client {
  public static void main(String[] args) {
    SoyaMilk soyaMilk = new RedBeanSoyaMilk();
    soyaMilk.make();
    soyaMilk = new BlackBeanSoyaMilk();
    soyaMilk.make();
  }
}

三、模板方法模式的钩子方法

  • 在模板方法模式的父类中,定义一个方法,默认不做任何事情,子类可以视情况要不要覆盖它,覆盖它之后,模板就会跟着修改。该方法叫做钩子。

四、总结

  • 基本思想:算法只存在在父类,容易修改。修改算法的时候,只需要修改父类的模板方法或者已经实现的某些步骤,子类就会继承。
  • 一般模板方法都会加上final关键字,防止子类重写模板方法。
  • 使用场景:当要完成某个过程,该过程要执行的一系列步骤,这一系列步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法来处理。