模板设计模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,而将一些步骤的实现延迟到子类中。
结构
- 抽象类(Abstract Class)
- 定义了模板方法(Template Method),它包含了算法的骨架,通常是一个
final
方法,以防止子类重写整个算法流程。 - 同时定义了一些抽象方法(Abstract Method),这些方法代表算法中的某些步骤,由子类来实现具体细节。
- 定义了模板方法(Template Method),它包含了算法的骨架,通常是一个
- 具体子类(Concrete Subclass)
- 继承自抽象类,实现抽象类中的抽象方法,从而提供算法中特定步骤的具体实现。
示例代码(以制作饮料为例)
// 抽象类,表示饮料制作模板
abstract class Beverage {
// 模板方法,定义了制作饮料的算法骨架
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
addCondiments();
}
public void boilWater() {
System.out.println("把水烧开");
}
// 抽象方法,由子类实现具体的冲泡过程
abstract void brew();
public void pourInCup() {
System.out.println("把饮料倒进杯子");
}
// 抽象方法,由子类实现添加调料的过程
abstract void addCondiments();
}
// 具体子类,制作咖啡
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("用咖啡粉冲泡");
}
@Override
void addCondiments() {
System.out.println("加糖和奶精");
}
}
// 具体子类,制作茶
class Tea extends Beverage {
@Override
void brew() {
System.out.println("用茶叶冲泡");
}
@Override
void addCondiments() {
System.out.println("加柠檬片");
}
}
优点
- 提高代码复用性:算法的骨架在抽象类中定义,多个子类可以复用这个模板,只需要实现特定的步骤。
- 易于维护和扩展:如果算法的整体流程需要改变,只需要在抽象类的模板方法中修改;如果某个步骤的实现需要更新,只需要在相应的子类中修改抽象方法的实现。
缺点
- 可能导致类层次结构复杂:如果有很多不同的算法变体,可能需要创建大量的子类,增加了类层次结构的复杂性。
- 违反开闭原则:当需要对模板方法进行修改时,可能需要修改抽象类,这在一定程度上违反了开闭原则(对扩展开放,对修改关闭)