23种设计模式-模板方法(Template Method)设计模式
创作时间:
作者:
@小白创作中心
23种设计模式-模板方法(Template Method)设计模式
引用
CSDN
1.
https://blog.csdn.net/weixin_45683778/article/details/146524482
模板方法设计模式是一种行为型设计模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。本文将详细介绍模板方法设计模式的定义、特点、结构、优缺点以及Java实现,并通过具体的代码示例帮助读者理解其原理和应用场景。
什么是模板方法设计模式?
模板方法设计模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些特定步骤。
使用场景
- 当多个类有相同的方法,且逻辑基本相同,只有某些细节不同时
- 当需要控制子类扩展的粒度,只允许子类重写特定操作时
- 当需要提取公共行为到父类,避免代码重复时
- 适用于框架设计、流程固定但步骤实现不同的场景
模板方法设计模式的特点
- 定义算法骨架:父类定义不变的部分和可变的抽象方法
- 代码复用:公共代码放在父类中实现
- 扩展控制:子类只能重写特定步骤,不能改变算法结构
- 反向控制:父类调用子类操作,而非子类调用父类
模板方法设计模式的结构
模板方法模式主要包含以下部分:
- AbstractClass(抽象类):定义模板方法和抽象的基本操作
- ConcreteClass(具体子类):实现抽象类定义的抽象操作
图例:
模板方法设计模式的优缺点
优点
- 代码复用:将公共行为放在父类中,避免代码重复
- 扩展性好:子类可以通过重写方法扩展特定步骤
- 反向控制:父类控制流程,子类只需关注实现细节
- 符合开闭原则:对扩展开放,对修改关闭
- 提高可维护性:算法结构清晰,易于维护
缺点
- 限制灵活性:子类必须遵循父类定义的算法结构
- 可能导致类膨胀:每个不同实现都需要一个子类
- 继承的缺点:Java单继承限制,子类无法再继承其他类
- 调试困难:模板方法中的流程控制可能使调试变得复杂
模板方法设计模式的Java实现
创建Person抽象类
/**
* 定义了模板方法TemplateMethod
*/
public abstract class Person {
public void TemplateMethod() {
System.out.println("上课 去教室"); // 1
PrimitiveOperation1(); // 2
System.out.println("下课 离开教室"); // 3
PrimitiveOperation2(); // 4
}
public abstract void PrimitiveOperation1(); // 原语操作 1 :上课过程 学生 听课…… 老师 讲课
public abstract void PrimitiveOperation2(); // 原语操作 2 :作业 学生 写作业 提交作业…… 老师 批改作业 打分数
}
创建两个具体子类Student和Teacher
Student子类
/**
* 具体子类 Student
*/
public class Student extends Person {
@Override
public void PrimitiveOperation1() {
System.out.println("学生:听课 学习 做笔记 提出问题");
}
@Override
public void PrimitiveOperation2() {
System.out.println("学生:写作业 提交作业");
}
}
Teacher子类
/**
* 具体子类 Teacher
*/
public class Teacher extends Person {
@Override
public void PrimitiveOperation1() {
System.out.println("老师:上课 讲课 解答问题 布置作业");
}
@Override
public void PrimitiveOperation2() {
System.out.println("老师:批改作业 打分数");
}
}
测试模板方法模式
/**
* 测试模板方法模式
*/
public class TemplateMethodPattern {
public static void main(String[] args) {
// 父类名 对象名 = new 子类名();
Person student = new Student();
Person teacher = new Teacher();
student.TemplateMethod();
System.out.println("=====我是分割线=====");
teacher.TemplateMethod();
}
}
运行结果
上课 去教室
学生:听课 学习 做笔记 提出问题
下课 离开教室
学生:写作业 提交作业
=====我是分割线=====
上课 去教室
老师:上课 讲课 解答问题 布置作业
下课 离开教室
老师:批改作业 打分数
代码总结
- Person抽象类定义了模板方法TemplateMethod和两个抽象操作
- Student和Teacher是具体子类,实现了各自的抽象操作
- 模板方法固定了流程顺序,子类只需实现特定步骤
- 客户端调用时,不同子类表现出不同的行为,但流程结构一致
总结
- 模板方法设计模式定义算法骨架,将具体步骤延迟到子类实现
- 核心是封装不变部分,扩展可变部分,实现代码复用
- 适用于流程固定但某些步骤实现不同的场景
Java源码中的应用场景:
- Java IO类中的InputStream/OutputStream:
- 定义了读取/写入的基本流程,具体实现由子类完成
热门推荐
自驾游选小排量车更划算,每公里省一半油钱
厦门金秋自驾游:鼓浪屿、环岛路2日游攻略
福州鼓山风景区:闽刹之冠涌泉寺与十八景自然景观
太疯狂了!TikTok上的美国网友集体迁移到小红书,还都在学普通话
为什么美国TikTok用户会注册小红书?
洛杉矶大火后的生态之殇:破坏、恢复与启示
化疗致淋巴细胞降低,四种方案助力免疫功能恢复
免疫防御到废物清理:淋巴系统守护人体健康的四大功能
Midjourney十大高阶绘图风格详解:从迪士尼到赛博朋克
8个实用技巧,让你的电脑桌面既美观又高效
手机壳定制全攻略:7步打造专属个性手机壳
《你微笑时很美》:四角恋谁才是赢家?
许凯主演《你微笑时很美》遭电竞圈抵制,豆瓣仅3.2分
斯诺克入门必修课:22颗球里的技巧与智慧
桌球运动入门攻略:规则、技巧与注意事项全解析
中国人民解放军陆军军医大学招生条件有哪些
王者荣耀打野机制详解:打野英雄选择与路线规划
春节拜年新花样:从上门拜访到云端祝福
春节申遗成功,各地过年习俗大揭秘
马来西亚华人“捞生”庆春节,越捞越“升”
移民美国带猫咪?这些准备步骤和注意事项要知道
猫咪打架怎么办?10个实用方案打造和谐多猫家庭
河南焦作云台山-神农山-青天河景区攻略,太行山水间的绝美画卷
过年去哪儿玩?跟着文物游郑州!
世外桃源:老挝(下)风土人情
浴血奋战:俄罗斯二战经典战争电影盘点
五部俄罗斯战争片:从写实巷战到反战喜剧
跆拳道入奥40年:从朝鲜古技到全球运动
西双版纳斥资41亿打造三大文旅项目,剑指900亿产业目标
李小龙:用功夫和哲学搭建中西文化交流的桥梁