模板方法模式概述
- 模板方法模式(Template Method Pattern)是一种行为设计模式
- 它在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中
- 模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤
模板方法模式实现
// 定义抽象类,它包含了算法的框架或者说模板方法
abstract class AbstractClass {
// 模板方法,定义了算法的骨架
public templateMethod(): void {
this.primitiveOperation1();
this.primitiveOperation2();
console.log("The common steps...");
this.primitiveOperation3();
}
// 原语操作,留给子类去实现
protected abstract primitiveOperation1(): void;
protected abstract primitiveOperation2(): void;
protected abstract primitiveOperation3(): void;
}
// 具体子类,实现抽象类中未实现的原语操作
class ConcreteClass1 extends AbstractClass {
protected primitiveOperation1(): void {
console.log("ConcreteClass1 does something for primitiveOperation1.");
}
protected primitiveOperation2(): void {
console.log("ConcreteClass1 does something for primitiveOperation2.");
}
protected primitiveOperation3(): void {
console.log("ConcreteClass1 does something for primitiveOperation3.");
}
}
class ConcreteClass2 extends AbstractClass {
protected primitiveOperation1(): void {
console.log("ConcreteClass2 does something different for primitiveOperation1.");
}
protected primitiveOperation2(): void {
console.log("ConcreteClass2 does something different for primitiveOperation2.");
}
protected primitiveOperation3(): void {
console.log("ConcreteClass2 does something different for primitiveOperation3.");
}
}
// 使用示例
function main() {
const concrete1 = new ConcreteClass1();
concrete1.templateMethod();
console.log("\n---\n");
const concrete2 = new ConcreteClass2();
concrete2.templateMethod();
}
// 输出:
// ConcreteClass1 does something for primitiveOperation1.
// ConcreteClass1 does something for primitiveOperation2.
// The common steps...
// ConcreteClass1 does something for primitiveOperation3.
// ---
// ConcreteClass2 does something different for primitiveOperation1.
// ConcreteClass2 does something different for primitiveOperation2.
// The common steps...
// ConcreteClass2 does something different for primitiveOperation3.
- 在这个例子中:
AbstractClass是抽象类,它定义了算法的模板方法templateMethod和几个抽象方法primitiveOperation1、primitiveOperation2和primitiveOperation3 - 这些抽象方法需要子类去实现,
ConcreteClass1和ConcreteClass2是AbstractClass的具体子类,它们各自实现了父类中声明的抽象方法 - 当调用
templateMethod时,它按照固定的流程调用子类的原语操作方法,即便每个子类对原语操作的具体实现不同 - 但算法的总体结构保持不变, 这就是模板方法模式的核心所在
模板方法模式优缺点
1 ) 优点
- 封装不变部分
- 模板方法模式在抽象类中封装了算法的不变部分,使得这些部分在子类中无需重复实现
- 这有助于减少代码的冗余,提高代码的重用性
- 定义算法骨架
- 通过定义算法的骨架,模板方法模式确保了算法的主要结构在子类中保持一致
- 这有助于维护代码的一致性和可读性
- 扩展灵活
- 子类可以通过实现抽象方法和覆盖钩子方法来扩展或修改算法的具体步骤,而无需改变算法的整体结构
- 这使得模板方法模式具有很好的扩展性
- 易于维护
- 由于算法的主要结构在父类中定义,当需要修改算法时,只需在父类中修改相关部分,而无需修改所有子类
- 这降低了维护成本,提高了系统的可维护性
2 )缺点
-
可能导致子类膨胀
- 如果算法中有很多可变步骤,每个步骤都需要一个抽象方法或钩子方法来实现,这可能导致子类数量过多,使得系统变得复杂
-
可能违反“开闭原则”
- 在某些情况下,如果子类需要添加新的步骤或修改现有步骤的顺序,可能需要修改抽象类中的模板方法
- 这违反了“开闭原则”,即对扩展开放,对修改封闭
- 虽然这种情况可以通过引入新的钩子方法或抽象方法来解决,但这也可能增加系统的复杂性
-
过度使用可能导致代码结构不清晰
- 如果过度使用模板方法模式,可能会导致代码结构变得不清晰,难以理解和维护
- 因此,在使用模板方法模式时,需要权衡其优缺点,并根据具体需求进行适当的使用
3 )总结
- 总的来说,模板方法模式是一种非常有用的设计模式,它可以帮助我们封装算法的不变部分,定义算法的骨架,并提供扩展的灵活性
- 然而,在使用时也需要注意其可能带来的缺点,以避免过度使用或滥用该模式
142



被折叠的 条评论
为什么被折叠?



