設計模式之模板方法設計模式
阿新 • • 發佈:2021-11-30
模板方法模式在一個方法中定義了一個演算法骨架,並且 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();
}
}