网站首页 > 文章精选 正文
模板方法模式的概念
模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。在模板方法模式中,一个抽象类公开定义了执行它的方法的方式(模板方法),而将一些具体的步骤留给子类去实现。这样可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
使用场景
- 多个子类有共有的方法,并且逻辑基本相同时:可以将这些公共的逻辑提取到一个抽象类中,作为模板方法的一部分,而不同的部分由子类实现。
- 需要控制子类的扩展:通过模板方法模式,可以在抽象类中定义好算法的框架,只允许子类在特定的步骤上进行扩展,保证了算法的整体结构不变。
- 代码复用:将公共的代码逻辑放在抽象类中,避免了在多个子类中重复编写相同的代码。
使用方法
- 定义抽象类:在抽象类中定义模板方法和一些抽象方法。模板方法定义了算法的骨架,它会调用抽象方法和具体方法。
- 实现具体方法:在抽象类中可以实现一些具体的方法,这些方法是算法中通用的步骤。
- 定义抽象方法:抽象方法是算法中需要子类实现的具体步骤。
- 创建子类:子类继承抽象类,实现抽象方法,完成算法中特定步骤的具体实现。
Java 语言实现
下面是一个简单的示例,模拟制作饮料的过程。制作饮料的基本步骤包括煮水、冲泡、倒入杯子、添加调料,其中煮水和倒入杯子的步骤是通用的,而冲泡和添加调料的步骤因饮料种类而异。
// 抽象类,定义制作饮料的模板方法
abstract class Beverage {
// 模板方法,定义制作饮料的算法骨架
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 具体方法,煮水,所有饮料都需要煮水
private void boilWater() {
System.out.println("Boiling water");
}
// 抽象方法,冲泡,不同饮料冲泡方式不同
abstract void brew();
// 具体方法,倒入杯子,所有饮料都需要倒入杯子
private void pourInCup() {
System.out.println("Pouring into cup");
}
// 抽象方法,添加调料,不同饮料添加的调料不同
abstract void addCondiments();
}
// 咖啡类,继承自Beverage
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("Dripping Coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}
// 茶类,继承自Beverage
class Tea extends Beverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding Lemon");
}
}
// 测试类
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
// 制作咖啡
Beverage coffee = new Coffee();
System.out.println("Making coffee...");
coffee.prepareBeverage();
System.out.println();
// 制作茶
Beverage tea = new Tea();
System.out.println("Making tea...");
tea.prepareBeverage();
}
}
代码解释
- Beverage 类:是一个抽象类,定义了制作饮料的模板方法prepareBeverage(),该方法包含了煮水、冲泡、倒入杯子、添加调料四个步骤。其中boilWater()和pourInCup()是具体方法,brew()和addCondiments()是抽象方法,需要子类实现。
- Coffee 类和 Tea 类:继承自Beverage类,分别实现了brew()和addCondiments()方法,完成了冲泡咖啡和茶以及添加相应调料的具体步骤。
- TemplateMethodPatternDemo 类:是测试类,创建了Coffee和Tea对象,并调用prepareBeverage()方法制作饮料。
通过这种方式,我们可以在不改变制作饮料的整体算法结构的情况下,通过不同的子类实现不同饮料的制作。
- 上一篇: 一文读懂粒子群算法(粒子群算法步骤)
- 下一篇: Linux操作系统:中断类型和中断的作用
猜你喜欢
- 2025-03-24 一文读懂粒子群算法(粒子群算法步骤)
- 2025-03-24 数据结构与算法—欧几里得算法(欧几里得算法c++语言)
- 2025-03-24 FPGA在图像处理中的算法结构(fpga在图像处理中的算法结构有哪些)
- 2025-03-24 唐太宗的“凌烟阁算法”:从二十四功臣到现代高管团队的生死局
- 2025-03-24 除了矢量控制算法,还有哪些控制算法可用于永磁同步电机?
- 2025-03-24 数据结构|算法(数据结构算法的时间复杂度怎么计算)
- 2025-03-24 收放卷模糊控制算法的实现(收放卷模糊控制算法的实现过程)
- 2025-03-24 算法会打败写手,DeepSeek给出生产高展现量文章的流水线
- 2025-03-24 优秀的过程控制工程师的必备能力:懂控制算法,也要懂工艺
- 2025-03-24 还有小白不知道什么是顺序功能图 (SFC)?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)