目录
1.基本介绍
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
2.模板设计模式能解决的问题
- 当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
- 编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式.
3.最佳实践
需求:
- 有多个类,完成不同的任务job
- 要求统计得到各自完成任务的时间
- 请编程实现TestTemplate.java
1.先用最容易想到的方法—》代码实现
2.分析问题,提出使用模板设计模式
【个人理解:
原始方法:如果需要计算一个job的运行时间,需要在每个job方法体前后分别获取当前时间,最后做差
改进:把获取当前时间的代码写成一个方法,把job嵌入在其中间。优点:如果job需要替换,只需要在获取时间的代码块中把job方法替换即可。缺点:每个类都需要重新写一个获取时间的方法,代码的复用性差。
使用抽象类再次改进:定义一个抽象类,把各个类中共有的方法抽取出来,即把计算时间的方法放在抽象类中,作为普通的公共类给子类使用;而把不确定有什么功能的job()方法写成抽象方法嵌入其中。这样其他类想计算某个方法的使用时间时,只需要继承该抽象类,重写其job()方法即可。】
代码:
abstract public class Template { //抽象类-模板设计模式
public abstract void job();//抽象方法
public void calculateTime() {//实现方法,调用 job 方法
//得到开始的时间
long start = System.currentTimeMillis();
job(); //动态绑定机制
//得的结束的时间
long end = System.currentTimeMillis();
System.out.println("任务执行时间 " + (end - start));
}
}
public class AA extends Template {
//计算任务
//1+....+ 800000
@Override
public void job() { //实现 Template 的抽象方法 job
long num = 0;
for (long i = 1; i <= 800000; i++) {
num += i;
}
}
// public void job2() {
// //得到开始的时间
// long start = System.currentTimeMillis();
// long num = 0;
// for (long i = 1; i <= 200000; i++) {
// num += i;
// }
// //得的结束的时间
// long end = System.currentTimeMillis();
// System.out.println("AA 执行时间 " + (end - start));
// }
}