模板方法模式是一种设计模式,它定义了一个算法的骨架,而算法的具体步骤由子类实现。它允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
结构
模板方法模式包含以下角色:
- 抽象类:定义算法的骨架,包括算法的步骤和一个抽象方法,由子类实现。
- 具体子类:实现抽象方法,提供算法的具体步骤。
实现
// 抽象类
abstract class AbstractClass {
public final void templateMethod() {
step1();
step2();
step3();
}
protected abstract void step1();
protected abstract void step2();
protected abstract void step3();
}
// 具体子类
class ConcreteClassA extends AbstractClass {
@Override
protected void step1() {
// 具体实现
}
@Override
protected void step2() {
// 具体实现
}
@Override
protected void step3() {
// 具体实现
}
}
// 具体子类
class ConcreteClassB extends AbstractClass {
@Override
protected void step1() {
// 具体实现
}
@Override
protected void step2() {
// 具体实现
}
@Override
protected void step3() {
// 具体实现
}
}
在上面的示例中,AbstractClass
定义了算法的骨架,其中templateMethod
方法调用三个抽象方法:step1
、step2
和step3
。ConcreteClassA
和ConcreteClassB
是具体子类,它们实现抽象方法以提供算法的具体步骤。
优点:
- 可扩展性:子类可以重新定义算法的某些步骤,而无需修改算法的整体结构。
- 代码复用:算法的骨架在抽象类中定义,可由所有子类复用。
- 一致性:通过定义算法的骨架,模板方法模式确保所有子类遵循一致的算法结构。
缺点:
- 灵活性受限:算法的骨架由抽象类定义,子类只能重新定义抽象方法,不能更改算法的整体结构。
- 类层次结构复杂:如果算法有许多步骤,则可能导致类层次结构变得复杂。
应用场景
模板方法模式适用于以下场景:
- 当需要定义算法的骨架,但算法的具体步骤需要由子类实现时。
- 当需要确保算法的一致性,同时允许子类定制其某些步骤时。
- 当需要在不修改现有代码的情况下扩展算法的功能时。
结论
模板方法模式是一种强大的设计模式,它提供了一种灵活且可扩展的方式来定义和扩展算法。通过将算法的骨架与具体步骤的实现分离开来,它允许子类定制算法的行为,同时保持算法的整体结构。