跳到主要内容

模版方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,并允许子类重写其中的特定步骤,而不改变算法的结构。模板方法使得子类可以在不改变算法整体结构的情况下,重新定义算法中的某些步骤。

模板方法模式主要包括以下几个角色:

  1. 抽象类(Abstract Class): 定义了算法的骨架,包含了一个或多个抽象方法,这些方法由子类去实现。

  2. 具体类(Concrete Class): 实现了抽象类中的抽象方法,完成算法中特定步骤的具体实现。

以下是一个简单的 JavaScript 示例,演示了模板方法模式:

// 抽象类
class AbstractClass {
templateMethod() {
this.step1();
this.step2();
this.step3();
}

step1() {
throw new Error('step1 method must be implemented by subclasses.');
}

step2() {
throw new Error('step2 method must be implemented by subclasses.');
}

step3() {
throw new Error('step3 method must be implemented by subclasses.');
}
}

// 具体类A
class ConcreteClassA extends AbstractClass {
step1() {
console.log('ConcreteClassA: Step 1');
}

step2() {
console.log('ConcreteClassA: Step 2');
}

step3() {
console.log('ConcreteClassA: Step 3');
}
}

// 具体类B
class ConcreteClassB extends AbstractClass {
step1() {
console.log('ConcreteClassB: Step 1');
}

step2() {
console.log('ConcreteClassB: Step 2');
}

step3() {
console.log('ConcreteClassB: Step 3');
}
}

// 客户端代码
const concreteA = new ConcreteClassA();
concreteA.templateMethod();
// Output:
// ConcreteClassA: Step 1
// ConcreteClassA: Step 2
// ConcreteClassA: Step 3

const concreteB = new ConcreteClassB();
concreteB.templateMethod();
// Output:
// ConcreteClassB: Step 1
// ConcreteClassB: Step 2
// ConcreteClassB: Step 3

在这个例子中,AbstractClass 是抽象类,定义了算法的骨架,包含了三个步骤的抽象方法。ConcreteClassAConcreteClassB 是具体类,实现了抽象类中的抽象方法,完成了具体的步骤。

客户端代码创建了具体类的实例,并调用了模板方法 templateMethod,由于模板方法中包含了固定的算法骨架,所以具体类在执行过程中会按照模板方法定义的顺序执行各个步骤。

模板方法模式的优点包括:

  • 封装不变部分: 将算法的不变部分封装在模板方法中,避免了代码重复。
  • 提取可变部分: 将算法的可变部分留给子类实现,提高了灵活性。
  • 提高代码复用性: 模板方法定义了算法的骨架,可以在不改变整体结构的情况下重用代码。

模板方法模式常用于定义一系列操作中的算法骨架,而将具体实现延迟到子类中。