模板方法模式在一个方法中定义了一个算法骨架,并且 final 修饰防止子类重写。
方法中包含一些抽象方法,也就是一些步骤延迟到字类实现。
模板方法使得在不改变算法结构的情况下,重新定义算法中的某些步骤。
在Spring中大量用到了模板方法设计模式
子类实现父类的抽象方法,这种行为就可以看作是模板设计模式
案例
张三需要测试ArrayList
和LinkedList
的增加效率,查询效率。
未用模板方法设计模式:
public class AppTest {
@Test
public void testArrayListAdd() {
System.out.println("开始");
long start = System.currentTimeMillis();
List<Integer> list = new ArrayList<>();
for (int i = 1; i < 10000; i++) {
list.add(0,1);
}
long end = System.currentTimeMillis();
System.out.println("结束:" + (end - start));
}
@Test
public void testLinkedListAdd() {
System.out.println("开始");
long start = System.currentTimeMillis();
List<Integer> list = new LinkedList<>();
for (int i = 1; i < 10000; i++) {
list.add(0,1);
}
long end = System.currentTimeMillis();
System.out.println("结束:" + (end - start));
}
}
每次测试项变化后,都势必要修改原有代码
中间的测试代码一直在变化,而首尾的代码一直未变
使用模板方法设计模式改进:
先定义一个模板抽象类
public abstract class Template {
public void template(){
System.out.println("开始");
long start = System.currentTimeMillis();
testCode();
long end = System.currentTimeMillis();
System.out.println("结束:" + (end - start));
}
public abstract void testCode();
}
ArrayListTest
import java.util.ArrayList;
public class ArrayListTest extends Template{
@Override
public void testCode() {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i < 10000; i++) {
list.add(0,1);
}
}
}
LinkedListTest
import java.util.LinkedList;
import java.util.List;
public class LinkedListTest extends Template{
@Override
public void testCode() {
List<Integer> list = new LinkedList<>();
for (int i = 1; i < 10000; i++) {
list.add(0,1);
}
}
}
/**
* 使用模板方法模式
*/
public class AppTest {
public static void main(String[] args) {
//测试ArrayList
ArrayListTest at = new ArrayListTest();
at.template();
System.out.println();
//测试LinkedList
LinkedListTest lt = new LinkedListTest();
lt.template();
}
}