Skip to content

模板方法模式

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。

这种模式通过将不变的行为移到超类,而将可变的行为留给子类来实现,从而促进了代码重用和灵活性。模板方法模式通常用于框架开发中,提供了一种“反向钩子”机制,允许框架用户自定义部分行为而不影响整体流程。

模板方法模式的主要角色

  1. AbstractClass(抽象类):声明了模板方法,定义了算法的框架,它可能由一个或多个方法组成,并且包含了一些具体的方法和抽象方法。
  2. ConcreteClass(具体类):实现了抽象类中的抽象方法以完成算法中特定于具体实现的部分。

在 JavaScript 中的实现

下面是一个简单的例子来说明如何在 JavaScript 中使用模板方法模式:

示例:制作咖啡和茶的过程

假设我们需要编写一个程序来模拟制作咖啡和茶的过程,这两个过程有很多相似之处,但也有一些不同点。我们可以使用模板方法模式来避免重复代码。

javascript
// AbstractClass(抽象类)
class Beverage {
  // 模板方法
  prepareRecipe() {
    this.boilWater();
    this.brew();
    this.pourInCup();
    if (this.customerWantsCondiments()) {
      // 钩子方法,默认实现
      this.addCondiments();
    }
  }

  boilWater() {
    console.log("Boiling water");
  }

  pourInCup() {
    console.log("Pouring into cup");
  }

  brew() {
    throw new Error("This method should be overridden");
  }

  addCondiments() {
    throw new Error("This method should be overridden");
  }

  customerWantsCondiments() {
    return true; // 默认实现,可以被子类覆盖
  }
}

// ConcreteClass(具体类)
class Coffee extends Beverage {
  brew() {
    console.log("Dripping Coffee through filter");
  }

  addCondiments() {
    console.log("Adding Sugar and Milk");
  }

  customerWantsCondiments() {
    return confirm("Would you like sugar and milk in your coffee?");
  }
}

class Tea extends Beverage {
  brew() {
    console.log("Steeping the tea");
  }

  addCondiments() {
    console.log("Adding Lemon");
  }

  customerWantsCondiments() {
    return confirm("Would you like lemon with your tea?");
  }
}

// 使用示例
const coffee = new Coffee();
coffee.prepareRecipe();

console.log("\n");

const tea = new Tea();
tea.prepareRecipe();

代码解释

  • Beverage(抽象类):定义了prepareRecipe作为模板方法,它包含了四个步骤:煮水、冲泡、倒杯以及根据情况添加调料。其中brewaddCondiments是抽象方法,需要在子类中实现;customerWantsCondiments是一个钩子方法,默认返回true,但可以根据需求在子类中覆盖。
  • Coffee 和 Tea(具体类):分别实现了抽象类Beverage中的抽象方法brewaddCondiments,并根据各自的特性提供了具体的实现。此外,它们还覆盖了customerWantsCondiments方法,以提供定制化的体验。
  • 使用示例:展示了如何创建CoffeeTea实例,并调用它们的prepareRecipe方法来准备饮品。

应用场景

模板方法模式适用于以下几种情况:

  • 当有多个类执行相似的操作,只是某些特定步骤不同的时候。
  • 当希望将通用逻辑集中在一个地方,而不是分散在多个类中时。
  • 当想要让子类能够扩展某个算法而不修改其结构时。

通过使用模板方法模式,可以减少代码重复,增强代码复用性,并提供良好的扩展性和灵活性。这对于构建具有固定流程但细节可能变化的应用程序非常有用。

Released under the MIT License.