跳到主要内容

模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,但将一些步骤的实现延迟到子类。这意味着模板方法在父类中定义了一个算法的模板,子类可以通过覆盖或实现特定步骤的方法来自定义算法的具体行为。模板方法模式有助于将通用算法的核心逻辑与变化的实现细节分离,以提高代码的可维护性和可扩展性。

在模板方法模式中,通常包括以下角色:

模板方法(Template Method):在父类中定义的模板方法,描述了算法的骨架,通常包括一系列的步骤,其中的一些步骤可以被子类定制。

具体方法(Concrete Method):在父类中定义的具体实现步骤,这些步骤可能是通用的,但也可以被子类继承或覆盖。

抽象方法(Abstract Method):在父类中定义的抽象方法,用于表示由子类实现的具体步骤,子类必须提供这些方法的具体实现。

场景

框架设计:在软件框架中,模板方法模式用于定义通用的算法骨架,允许不同应用程序或模块提供特定的实现。

库设计:编写库或工具包时,可以使用模板方法模式来定义通用操作的算法,同时允许用户自定义具体实现。

流程控制:在业务流程中,模板方法模式可以用于规范流程中的各个步骤,从而确保流程的一致性。

实现

// 模板方法模式的示例

// 咖啡因饮料模板
class CaffeineBeverage {
prepareBeverage() {
this.boilWater();
this.brew();
this.pourInCup();
this.addCondiments();
}

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

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

// 抽象方法,需要子类提供具体实现
brew() {
throw new Error(
"Abstract method - should be overridden by concrete subclass"
);
}

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

// 具体咖啡类
class Coffee extends CaffeineBeverage {
brew() {
console.log("Dripping coffee through filter");
}

addCondiments() {
console.log("Adding sugar and milk");
}
}

// 具体茶类
class Tea extends CaffeineBeverage {
brew() {
console.log("Steeping the tea");
}

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

// 客户端代码
const coffee = new Coffee();
const tea = new Tea();

console.log("Making coffee...");
coffee.prepareBeverage();

console.log("\nMaking tea...");
tea.prepareBeverage();

在上面的示例中,CaffeineBeverage 是模板方法,定义了制备咖啡因饮料的通用算法骨架。它包括了一系列的步骤,其中 brew 是一个抽象方法,需要子类提供具体实现。

Coffee 和 Tea 是具体的饮料类,它们继承自 CaffeineBeverage 并提供了 brew 方法的具体实现。这使得每种饮料可以根据自身需求来定制制备过程,同时共享通用的制备框架。

模板方法模式有助于提高代码的重用性,同时允许子类自定义特定步骤的实现。这在创建框架、库或定义标准流程时非常有用。