模板方法设计模式
抽象类体现的就是一种模板的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
解决的问题
当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
模式的特点
模式的主要优点:
-
封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
-
在父类中提取了公共的部分代码,便于代码复用。
-
部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
模式的主要缺点:
-
对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。
-
父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
-
由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。
案例说明
如:计算某段代码执行所需花费的时间。
Template.java
abstract class Template {
//计算某段代码执行所需要花费的时间
public void spendTime(){
long start = System.currentTimeMillis();
//不确定的部分
this.code();
long end = System.currentTimeMillis();
System.out.println("花费的时间为:"+(end - start));
}
public abstract void code();
}
SubTemplate.java
public class SubTemplate extends Template{
@Override
public void code() {
//求1到1000中的素数
for(int i = 2; i <= 1000; i++){
boolean flag = true;
for(int j = 2; j <= Math.sqrt(i);j++){
if(i % j == 0){
flag = false;
break;
}
}
if(flag){
System.out.println(i);
}
}
}
}
Template.java
public class TemplateTest {
public static void main(String[] args) {
Template sub = new SubTemplate();
sub.spendTime();
}
}
运行结果:
应用场景
-
模板方法设计模式是编程中经常用到的模式,各个框架、类库中都有它的影子。
比如常见的有: -
数据库访问的封装
-
Junit单元测试
-
JavaWeb的Servlet中关于doGet、doPost方法调用
-
Hibernate中模板程序
-
Spring中JDBCTemplate等
博主首页链接:https://blog.csdn.net/weixin_44736475
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️