模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法和封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。

  1. class Beverage {
  2. constructor({brewDrink, addCondiment}) {
  3. this.brewDrink = brewDrink
  4. this.addCondiment = addCondiment
  5. }
  6. /* 烧开水,共用方法 */
  7. boilWater() { console.log('水已经煮沸=== 共用') }
  8. /* 倒杯子里,共用方法 */
  9. pourCup() { console.log('倒进杯子里===共用') }
  10. /* 模板方法 */
  11. init() {
  12. this.boilWater()
  13. this.brewDrink()
  14. this.pourCup()
  15. this.addCondiment()
  16. }
  17. }
  18. /* 咖啡 */
  19. const coffee = new Beverage({
  20. /* 冲泡咖啡,覆盖抽象方法 */
  21. brewDrink: function() { console.log('冲泡咖啡') },
  22. /* 加调味品,覆盖抽象方法 */
  23. addCondiment: function() { console.log('加点奶和糖') }
  24. })
  25. coffee.init()

场景例子

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 子类中公共的行为应被提取出来并集中到一个公共父类中的避免代码重复

    优点

  • 提取了公共代码部分,易于维护

    缺点

  • 增加了系统复杂度,主要是增加了的抽象类和类间联系