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();
        }
    
    }
  • 相关阅读:
    20180925-3 效能分析
    20180925-7 规格说明书-吉林市2日游
    20180918博客作业
    第二周例行报告
    2018091-2博客作业
    容器(list集合)
    给应届生们的建议(一定要看哦)!
    MySQL 和 JDBC(Java数据库连接)
    Oracle常用数据库对象(片段)
    7353. 【2021.11.06NOIP提高A组模拟】qaq (qaq)
  • 原文地址:https://www.cnblogs.com/doagain/p/15625966.html
Copyright © 2011-2022 走看看