Loading

设计模式之模板方法设计模式

模板方法模式在一个方法中定义了一个算法骨架,并且 final 修饰防止子类重写。
方法中包含一些抽象方法,也就是一些步骤延迟到字类实现。
模板方法使得在不改变算法结构的情况下,重新定义算法中的某些步骤。

在Spring中大量用到了模板方法设计模式

子类实现父类的抽象方法,这种行为就可以看作是模板设计模式

image-20211130152608499


案例

张三需要测试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();
    }

}
posted @ 2021-11-30 20:17  yescctv6  阅读(78)  评论(0)    收藏  举报