1. 基本介绍
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
2. 模板设计模式能解决的问题
1)当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式.
3. 最佳实践
需求
1)有多个类,完成不同的任务job
2) 要求统计得到各自完成任务的时间
3)请编程实现TestTemplate.java
设计一个抽象类(Template),能完成如下功能:
1.编写方法calculateTime(),可以计算某代码的耗时时间
2.编写抽象类job()
3.编写一个子类Sub,继承抽象Template,并实现job方法
4.编写一个测试类TestTemplate,看看是否好用
3.1 普通方法 401
代码在com.stulzl.abstract_templatecommon.包中
测试TemplateCommon
package com.stulzl.abstract_testtemplate;
//抽象类实践--模板设计模式401
public class TestTemplate {
public static void main(String[] args) {
AA aa = new AA();
aa.calculateTime();
BB bb = new BB();
bb.calculateTime();
}
}
AA类
package com.stulzl.abstract_templatecommon;
public class AA {
//通过观察job()和job()2有很多相同部分,代码冗余严重,
//所以编写calculateTime()方法,将共同部分代码写进来,然后调用任务job()方法,从而节省代码量
public void calculateTime(){
long start = System.currentTimeMillis();//获取当前时间(开始时间)
job();
long end = System.currentTimeMillis();//获取当前时间(结束时间)
System.out.println("AA执行时间 "+(end-start));
}
//计算任务
//1+....+ 800000
public void job(){
long num = 0;
// long start = System.currentTimeMillis();//获取当前时间(开始时间)
for (long i = 1; i <=800000; i++) {
num+=i;
}
// long end = System.currentTimeMillis();//获取当前时间(结束时间)
// System.out.println("AA执行时间 "+(end-start));
}
// public void job2(){
// long num = 0;
// long start = System.currentTimeMillis();//获取当前时间(开始时间)
// for (long i = 1; i <=100000; i++) {
// num+=i;
// }
// long end = System.currentTimeMillis();//获取当前时间(结束时间)
// System.out.println("AA执行时间 "+(end-start));
// }
}
BB类
package com.stulzl.abstract_templatecommon;
public class BB {
//与AA类中的calculateTime()方法原因一样
public void calculateTime(){
long start = System.currentTimeMillis();//获取当前时间(开始时间)
job();
long end = System.currentTimeMillis();//获取当前时间(结束时间)
System.out.println("BB执行时间 "+(end-start));
}
public void job(){
long num = 1;
// long start = System.currentTimeMillis();//获取当前时间(开始时间)
for (long i = 1; i <=800000; i++) {
num*=i;
}
// long end = System.currentTimeMillis();//获取当前时间(结束时间)
// System.out.println("BB执行时间 "+(end-start));
}
}
3.2 分析问题,提出使用模板设计模式 401
代码在com.stulzl.abstract_template.包中
测试Test
package com.stulzl.abstract_template;
//抽象类—模板设计模式401
public class Test {
public static void main(String[] args) {
CC aa = new CC();
aa.calculateTime();//涉及多态动态绑定机制
DD bb = new DD();
bb.calculateTime();
}
}
父类Template
package com.stulzl.abstract_template;
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));
}
}
子类CC
package com.stulzl.abstract_template;
public class CC extends Template{//子类
//计算任务
//1+....+ 800000
public void job(){//实现父类抽象方法重写
long num = 0;
for (long i = 1; i <=800000; i++) {
num+=i;
}
}
}
子类DD
package com.stulzl.abstract_template;
public class DD extends Template{//子类
public void job(){//实现父类抽象方法重写
long num = 1;
for (long i = 1; i <=800000; i++) {
num*=i;
}
}
}