zoukankan      html  css  js  c++  java
  • 设计模式之模板方法设计模式

    模板方法模式在一个方法中定义了一个算法骨架,并且 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();
        }
    
    }
  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/doagain/p/15625966.html
Copyright © 2011-2022 走看看