1. 程式人生 > 其它 >設計模式之模板方法設計模式

設計模式之模板方法設計模式

模板方法模式在一個方法中定義了一個演算法骨架,並且 final 修飾防止子類重寫。
方法中包含一些抽象方法,也就是一些步驟延遲到字類實現。
模板方法使得在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

在Spring中大量用到了模板方法設計模式

子類實現父類的抽象方法,這種行為就可以看作是模板設計模式


案例

張三需要測試ArrayListLinkedList的增加效率,查詢效率。

未用模板方法設計模式:

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();
    }

}