• 重学设计模式-模板方法模式


    模板方法 - 定义与类型

    1.定义

    定义了一个算法的骨架,并可以子类为一个或多个步骤提供现实

    1.1 特点

    ​ 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤

    1.2 类型 : 行为型

    2.适用场景

    ​ 1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现

    ​ 2、各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复

    3.缺点

    1.类数目增加

    2.增加了系统实现的复杂度

    3.继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

    4.优点

    ​ 1.提高复用性

    ​ 2.提高扩展性

    ​ 3.符合开闭原则

    5.模板方法-扩展

    钩子方法

    6.模板方法-相关设计模式

    模板方法模式和工厂方法模式

    模板方法模式和策略模式

    策略模式改变算法流程

    模板方法模式 不该变算法流程 而是交给子类去实现

    7.uml 设计图
    在这里插入图片描述
    8.代码如下

    package com.zw.design.pattern.creational.behavioral.templatemetod;
    
    public abstract class ACourse {
    
        protected final void makeCourse(){
    
            this.makePPT();
            this.makeVideo();
            //钩子方法判断
            if (this.needWriteArticle()){
                this.writeArticle();
            }
            this.packageCourse();
        }
    
        final void makePPT(){
            System.out.println("编写ppt");
        }
    
        final void makeVideo(){
            System.out.println("编写视频");
        }
    
        final void writeArticle(){
            System.out.println("编写手记");
        }
        //钩子方法
        protected boolean needWriteArticle(){
            return false;
        }
    
        abstract  void packageCourse();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    package com.zw.design.pattern.creational.behavioral.templatemetod;
    
    public class IOSCourse extends ACourse{
        @Override
        void packageCourse() {
            System.out.println("提供课程的IOS 代码");
            System.out.println("提供课程的图片等");
        }
        private boolean needWriteArticle;
    
    
        public IOSCourse(boolean needWriteArticle) {
            this.needWriteArticle = needWriteArticle;
        }
    
        @Override
        protected boolean needWriteArticle() {
            return this.needWriteArticle;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    package com.zw.design.pattern.creational.behavioral.templatemetod;
    
    public class SpringCourse extends ACourse{
        @Override
        void packageCourse() {
            System.out.println("提供spring源码课程代码");
        }
    
        @Override
        protected boolean needWriteArticle() {
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.测试类

    package com.zw.design.pattern.creational.behavioral.templatemetod;
    
    public class Test {
        public static void main(String[] args) {
            System.out.println("后端课程spring 课程 start");
            ACourse springCourse=new SpringCourse();
            springCourse.makeCourse();
            System.out.println("后端课程spring 课程 end");
    
    
            //1.0版本 现在IOS没有写手记 该如何去做了?
    //        System.out.println("前端课程IOS 课程 start");
    //        ACourse ios=new IOSCourse();
    //        ios.makeCourse();
    //        System.out.println("前端课程IOS 课程 end");
            //比如IOS 我现在有一个需求  IOS 分为 OS 和另外一种语言  OS 需要写手记
    
            System.out.println("前端课程IOS 课程 start");
            ACourse ios=new IOSCourse(true);//OS 写手记
            ios.makeCourse();
            System.out.println("前端课程IOS 课程 end");
    
            System.out.println("前端课程IOS 课程 start");
            ACourse ios2=new IOSCourse(false);//OS 不写手记
            ios2.makeCourse();
            System.out.println("前端课程IOS 课程 end");
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    测试结果如下
    在这里插入图片描述
    代码如下

    模板设计—源码解析

    在jdk当中 AbstractList这个类当中 使用模板方法
    在这里插入图片描述
    还有在servlet 当中 HttpServlet 当中使用的
    在这里插入图片描述
    在mybatis 当中的应用 BaseExecutor 的应用 使用模板方法模式
    在这里插入图片描述

  • 相关阅读:
    ndoe.js、npm相关笔记
    YOLOv7独家原创改进:最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度
    腾讯云CVM服务器5年可选2核4G和4核8G配置
    策略模式在社会中的应用
    OpenShift 4 - 使用 MachineConfigPool 特性分批升级集群 Worker 节点
    Scratch软件编程等级考试一级——20201219
    【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用
    深入理解强化学习——强化学习和有监督学习
    二进制安装部署k8s
    HTML5七夕情人节表白网页制作【幻化3D相册】HTML+CSS+JavaScript
  • 原文地址:https://blog.csdn.net/qq_32048567/article/details/126201858