模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
一,模板方法模式的定义
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
二,模板方法模式的结构
模板方法模式主要包含以下几个角色:
- 抽象类(AbstractClass):定义模板方法和基本方法。模板方法由基本方法组成,且一般为不可重写的。
- 具体类(ConcreteClass):实现抽象类中的基本方法。
三,模板方法模式的实现
下面是一个简单的模板方法模式的示例,展示了如何制作咖啡和茶。
// 抽象类
abstract class CaffeineBeverage {
// 模板方法
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring into cup");
}
}
// 具体类:咖啡
class Coffee extends CaffeineBeverage {
void brew() {
System.out.println("Dripping Coffee through filter");
}
void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
// 具体类:茶
class Tea extends CaffeineBeverage {
void brew() {
System.out.println("Steeping the tea");
}
void addCondiments() {
System.out.println("Adding Lemon");
}
}
// 客户端代码
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
CaffeineBeverage tea = new Tea();
CaffeineBeverage coffee = new Coffee();
System.out.println("Making tea...");
tea.prepareRecipe();
System.out.println("\nMaking coffee...");
coffee.prepareRecipe();
}
}
四,模板方法模式的优点
- 代码复用:通过将通用的代码放在抽象类中,避免了代码重复。
- 灵活性:子类可以通过重写基本方法来改变算法的某些步骤,而不影响算法的整体结构。
- 易于维护:算法的结构在抽象类中定义,修改算法结构时只需修改抽象类即可。
五,模板方法模式的应用场景
- 多个子类有公有的方法,并且逻辑基本相同时。
- 重要的、复杂的方法,可以考虑作为模板方法。
- 重构时,将相同的代码抽取到父类中。
六,模板方法模式的注意事项
- 控制反转:模板方法模式体现了控制反转(IOC)的思想,即将控制权从子类转移到父类。
- 方法的可见性:模板方法一般声明为
final
,以防止子类重写它。
七,结论
模板方法模式通过定义算法的骨架,将具体步骤延迟到子类中实现,使得算法的结构和具体实现分离,提供了代码复用和灵活性。它在实际开发中非常有用,特别是在需要定义一系列操作步骤且这些步骤在不同情况下有不同实现时。
如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。
扫描下方二维码,立即关注我们吧!
感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!