模板方法模式(Template Method Pattern) 是一种行为型设计模式,旨在定义一个操作中的算法骨架,而将一些步骤的具体实现延迟到子类中。通过模板方法模式,父类可以不改变算法结构的情况下,让子类重新定义某些步骤的实现,从而使得不同的子类可以有不同的行为。
模板方法模式适用于那些具有相同的整体流程但又希望子类可以在某些步骤上有所不同的场景。
模板方法模式主要包括以下几个角色:
模板方法模式适用于以下几种情况:
为了更好地理解模板方法模式,下面通过一个简单的例子来展示其实现。假设我们要实现一个“制作饮品”的过程,制作饮品的过程大致相同,但不同饮品的具体制作步骤有所不同。
我们首先定义一个抽象类 Beverage,它包含一个 prepareRecipe() 的模板方法,定义了制作饮品的骨架流程。模板方法中调用了几个抽象方法,这些方法在子类中实现,用于定制具体步骤。
public abstract class Beverage {
// 模板方法
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 公共步骤,所有饮品都需要煮水
private void boilWater() {
System.out.println("煮水");
}
// 抽象方法,具体的冲泡方式由子类实现
protected abstract void brew();
// 公共步骤,所有饮品都需要倒入杯中
private void pourInCup() {
System.out.println("倒入杯中");
}
// 抽象方法,具体的调味由子类实现
protected abstract void addCondiments();
}接下来,我们定义两个具体的饮品类 Tea 和 Coffee,它们分别实现了 brew() 和 addCondiments() 方法来定制不同的冲泡和调味方式。
// 具体子类:茶
public class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("用热水泡茶叶");
}
@Override
protected void addCondiments() {
System.out.println("添加柠檬");
}
}
// 具体子类:咖啡
public class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("用热水冲泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("添加糖和牛奶");
}
}在 Main 方法中,我们可以看到不同饮品的制作过程如何通过模板方法来完成。
public class Main {
public static void main(String[] args) {
Beverage tea = new Tea();
tea.prepareRecipe(); // 制作茶的过程
System.out.println("------------");
Beverage coffee = new Coffee();
coffee.prepareRecipe(); // 制作咖啡的过程
}
}4. 输出结果
煮水
用热水泡茶叶
倒入杯中
添加柠檬
------------
煮水
用热水冲泡咖啡
倒入杯中
添加糖和牛奶在这个例子中,Beverage 类作为抽象类,定义了一个模板方法 prepareRecipe(),它包含了制作饮品的公共步骤,如煮水、倒入杯中等。具体的步骤如冲泡和调味,由子类 Tea 和 Coffee 来实现,从而实现了流程的灵活定制。
为什么使用模板方法模式?
模板方法模式是结构化的,算法骨架已经固定,而策略模式则是将算法抽象出来,可以动态替换。
两者的核心区别在于:模板方法模式专注于定制化流程,而观察者模式更侧重于解耦和事件驱动。
模板方法模式通过在父类中定义算法的骨架,将一些步骤的实现推迟到子类中,从而使得算法的整体结构得到复用,并且允许子类灵活定制部分行为。它提高了代码的复用性、可扩展性和维护性,特别适用于那些算法骨架固定,而某些步骤可能发生变化的场景。
但是,模板方法模式也有一些限制,如过度依赖继承可能导致子类之间耦合性较强。总体来说,模板方法模式是一种非常实用的设计模式,适用于多个子类有相同的执行流程,且某些步骤需要根据不同情况进行定制的
如果您有任何问题或建议,欢迎留言讨论。