Java设计模式之行为型:模板方法模式
2023-09-11 14:19:59 时间
一、什么是模板方法模式:
模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟到子类中实现,只需将特性部分在父类中声明成抽象方法即可,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,不同的子类可以以不同的方式来实现这些逻辑。
模板方法模式的优点在于符合“开闭原则”,也能够实现代码复用,将不变的行为转移到父类,去除子类中的重复代码。但是缺点是不同的实现都需要定义一个子类,导致类的个数的增加使得系统更加庞大,设计更加抽象。
模板方法是一个方法,那么他与普通方法有什么不同呢?模板方法是定义在抽象类中,把基本操作方法组合在一起形成一个总算法或者一组步骤的方法。而普通的方法是实现各个步骤的方法,我们可以认为普通方法是模板方法的一个组成部分。
UML结构图:
- 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
- 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
二、模式实现:
举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。
抽象类AbstractClass:
//抽象类定义整个流程骨架
public abstract class AbstractPerson{
//模板方法,使用final修改,防止子类改变算法的实现步骤
public final void prepareGotoSchool(){
dressUp();
eatBreakfast();
takeThings();
}
//以下是不同子类根据自身特性完成的具体步骤
protected abstract void dressUp();
protected abstract void eatBreakfast();
protected abstract void takeThings();
}
具体类ConcreteClass:
public class Student extends AbstractPerson{
@Override
protected void dressUp() {
System.out.println(“穿校服");
}
@Override
protected void eatBreakfast() {
System.out.println(“吃妈妈做好的早饭");
}
@Override
protected void takeThings() {
System.out.println(“背书包,带上家庭作业和红领巾");
}
}
public class Teacher extends AbstractPerson{
@Override
protected void dressUp() {
System.out.println(“穿工作服");
}
@Override
protected void eatBreakfast() {
System.out.println(“做早饭,照顾孩子吃早饭");
}
@Override
protected void takeThings() {
System.out.println(“带上昨晚准备的考卷");
}
}
public class Client {
public static void main(String[] args) {
Student student = new Student()
student.prepareGotoSchool();
Teacher teacher = new Teacher()
teacher.prepareGotoSchool();
}
}
设计模式系列文章:
参考博客链接:
设计模式读书笔记-----模板方法模式_chenssy 的技术博客-CSDN博客
Java设计模式之模板方法模式(Template Method)_一个本科小生的奋斗史-CSDN博客_java 模板方法
相关文章
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- java集合(3)- Java中的equals和hashCode方法详解
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
- Java描述设计模式(19):模板方法模式
- Java字符串String 集合的迭代器
- Word处理控件Aspose.Words功能演示:如何使用 Java 从模板动态生成 Word 文档
- Ubuntu安装java的几种方式以及多个JAVA版本的切换
- Java详解,java后端应届生面试题
- 入门 Kotlin 和 Java 混合开发
- Java-struts2的问题 java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
- java学习笔记6(线程)
- JAVA基本数据类型所占字节数是多少?
- java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好
- 排名Top 100的Java类库
- java基本数据类型和包装类相互转换
- java高级用法之:在JNA中将本地方法映射到JAVA代码中
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法
- 『Java练习生的自我修养』java-se进阶⁴ • IO流概览
- [java][db]JAVA分布式事务原理及应用
- java线:辛格尔顿隐藏ThreadLocal实现线程数据共享
- 【Java实验】List容器的应用
- C++ and Java template class and function 模板类和模板函数
- Java idea 创建SqlMapConfig.xml,需要新增一个mybatis-cfg.xml模板
- Java SpringBoot Beetl模板