模版方法模式
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,并允许子类重写其中的特定步骤,而不改变算法的结构。模板方法使得子类可以在不改变算法整体结构的情况下,重新定义算法中的某些步骤。
模板方法模式主要包括以下几个角色:
-
抽象类(Abstract Class): 定义了算法的骨架,包含了一个或多个抽象方法,这些方法由子类去实现。
-
具体类(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
是抽象类,定义了算法的骨架,包含了三个步骤的抽象方法。ConcreteClassA
和 ConcreteClassB
是具体类,实现了抽象类中的抽象方法,完成了具体的步骤。
客户端代码创建了具体类的实例,并调用了模板方法 templateMethod
,由于模板方法中包含了固定的算法骨架,所以具体类在执行过程中会按照模板方法定义的顺序执行各个步骤。
模板方法模式的优点包括:
- 封装不变部分: 将算法的不变部分封装在模板方法中,避免了代码重复。
- 提取可变部分: 将算法的可变部分留给子类实现,提高了灵活性。
- 提高代码复用性: 模板方法定义了算法的骨架,可以在不改变整体结构的情况下重用代码。
模板方法模式常用于定义一系列操作中的算法骨架,而将具体实现延迟到子类中。