目录
1. 共有部分提取
如下,都计算时间和跑一个job的任务,提取之后代码稍微简介,但我们可以发现重复地方还是很多。
package jan06;
public class AA {
//统计开始和结束的时间
public void calculateTime() {
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println("AA 执行的时间是 :" + (end - start));
}
//执行一个job
public void job() {
long num = 0;
for (int i = 0; i < 800000; i++) {
num += i;
}
}
}
package jan06;
public class BB {
//统计开始和结束的时间
public void calculateTime() {
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println("BB 执行的时间是 :" + (end - start));
}
//执行一个job
public void job() {
long num = 0;
for (int i = 0; i < 800000; i++) {
num += i;
}
}
}
2. 抽象类模板设计模式
当需要无数个类似的job时候, 代码还是重复繁琐,我们可以提取抽象类模板。将job类抽象,放入calculateTime中,就可以形成一种设计模式。
1. 简历JobTemplate抽象类模板,将job方法定义为抽象方法。将calculateTime写在模板的普通方法。调用抽象类方法job。
2. 原来的AA和BB继承Job抽象类模板,并且重写Job方法。并且不需要在写自己的calculateTime方法。
3.创建测试类。
package jan06;
//抽象类, 模板设计模式。
abstract public class JobTemplate {
abstract public void job(); //抽象方法job
public void calculateTime(String task) {
long start = System.currentTimeMillis();
job();
long end = System.currentTimeMillis();
System.out.println(task+ "的执行时间是: " + (end - start));
}
}
package jan06;
public class BB extends JobTemplate{
//执行一个job
@Override
public void job() {
long num = 0;
for (int i = 0; i < 90000000; i++) {
num += i;
}
}
}
package jan06;
public class AA extends JobTemplate{
//执行一个job
@Override
public void job() {
long num = 0;
for (int i = 0; i < 800000; i++) {
num += i;
}
}
}
package jan06;
public class TestDemo {
public static void main(String[] args) {
AA aa = new AA();
aa.calculateTime("AA");
BB bb = new BB();
bb.calculateTime("BB");
}
}
2.1 输出效果
简单总结。
AA的编译类型和运行类型都是AA, 当AA里找不到calculateTime方法时, 就会去父类寻找该方法,从而运行。父类中的job方法可以实现动态绑定,真正实行job时,会找到子类AA、BB里重写的job方法。从而形成设计模式。