设计模式 - 模板方法模式(Template Method Pattern)
介绍
模板方法模式是一种行为设计模式,它定义了一个算法的骨架,并允许子类为某些步骤提供实现细节。模板方法模式使得子类可以在不改变算法结构的情况下重定义算法中的某些步骤。
实现
我们以一个烹饪食谱为例来展示模板方法模式的应用。假设我们要烹饪两种不同的汤,分别是西红柿汤和南瓜汤。这两种汤的基本烹饪步骤相似,但具体的食材和调味料有所不同。
定义抽象类
首先定义一个抽象类,它定义了算法的骨架,并声明了一些抽象的方法供子类实现。
abstract class SoupCooking {
public final void prepareSoup() {
prepareIngredients();
boilWater();
addIngredientsToPot();
cookFor();
serveSoup();
}
protected abstract void prepareIngredients();
protected abstract void addIngredientsToPot();
protected abstract void cookFor();
protected abstract void serveSoup();
private void boilWater() {
System.out.println("Boiling water...");
}
}
创建具体子类
然后创建具体的子类,它们实现了抽象类中声明的方法。
class TomatoSoup extends SoupCooking {
@Override
protected void prepareIngredients() {
System.out.println("Preparing tomatoes, onions, garlic...");
}
@Override
protected void addIngredientsToPot() {
System.out.println("Adding tomatoes, onions, garlic to the pot...");
}
@Override
protected void cookFor() {
System.out.println("Cooking for 30 minutes...");
}
@Override
protected void serveSoup() {
System.out.println("Serving the tomato soup...");
}
}
class PumpkinSoup extends SoupCooking {
@Override
protected void prepareIngredients() {
System.out.println("Preparing pumpkin, carrots, onion...");
}
@Override
protected void addIngredientsToPot() {
System.out.println("Adding pumpkin, carrots, onion to the pot...");
}
@Override
protected void cookFor() {
System.out.println("Cooking for 45 minutes...");
}
@Override
protected void serveSoup() {
System.out.println("Serving the pumpkin soup...");
}
}
使用模板方法模式
接下来,在主程序中使用模板方法模式来准备不同的汤。
public class Kitchen {
public static void main(String[] args) {
SoupCooking tomatoSoup = new TomatoSoup();
tomatoSoup.prepareSoup();
SoupCooking pumpkinSoup = new PumpkinSoup();
pumpkinSoup.prepareSoup();
}
}
使用场景
模板方法模式适用于以下情况:
- 一个类定义了算法的骨架,而将一些步骤延迟到子类去实现。
- 算法的细节可能会改变,但是算法的结构保持不变。
- 控制子类扩展,强制子类遵循某种算法。
总结
模板方法模式通过定义一个算法的骨架,并允许子类为某些步骤提供实现细节,使得子类可以在不改变算法结构的情况下重定义算法中的某些步骤。这种方式不仅增强了代码的可维护性和可扩展性,还能确保算法的一致性。
以上就是模板方法模式的一个实现案例,希望这篇文章能帮助你理解模板方法模式的使用方式及其优势。
评论区