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();
        }
    
    }
  • 相关阅读:
    【Aizu
    【Aizu
    【OpenJ_Bailian
    leetcode-225-Implement Stack using Queues
    leetcode-219-Contains Duplicate II(使用set来判断长度为k+1的闭区间中有没有重复元素)
    leetcode-217-Contains Duplicate(使用排序来判断整个数组有没有重复元素)
    leetcode-840-Magic Squares In Grid
    leetcode-198-House Robber(动态规划)
    leetcode-191-Number of 1 Bits
    leetcode-189-Rotate Array
  • 原文地址:https://www.cnblogs.com/doagain/p/15625966.html
Copyright © 2011-2022 走看看