码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JAVA设计模式之模板方法模式


    Java 设计模式之模板方法

    文章目录

    • Java 设计模式之模板方法
      • 1. 定义
      • 2. 类型
      • 3. 模板方法的适用场景
      • 4. 优点
      • 5. 缺点
      • 6. 模板方法-扩展
      • 7. 相关设计模式
      • 8. coding
        • 8.1 抽象接口
        • 8.2 抽象接口子类
        • 8.3 实现类
      • 9. 源码解析
        • 9.1 AbstractList
        • 9.2 HttpServlet
        • 9.3 BaseExecutor
      • 10. UML

    1. 定义

    1. 一个算法骨架,并允许子类提供一个或者多个步骤实现、
    2. 模板方法使得子类在不改变算法结构的情况下,重新定义算法的某些步骤

    2. 类型

    行为型

    3. 模板方法的适用场景

    1. 一次性实行算法不变的部分,并将可变的行为留给子类来实现
    2. 各个子类公共的部分被提取出来并集中到一个公共父类中,从而避免代码重复

    4. 优点

    1. 提高复用性
    2. 提高扩展性
    3. 符合开闭原则

    5. 缺点

    1. 类数目增加
    2. 增加了系统实现的复杂度
    3. 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

    6. 模板方法-扩展

    1. 钩子方法

    7. 相关设计模式

    1. 模板方法和工厂方法

      模板方法是工厂方法的一种特殊实现

    2. 模板方法和策略方法

      策略模式 使不同的算法相互替换

    8. coding

    8.1 抽象接口

    public abstract class ICourse {
    
        protected final void makeCourse() {
              this.makePPT();
              this.makeVideo();
              if (this.isNeedArticle()){
                  this.makeArticle();
              }
    
              this.packageCourse();
        }
    
        final void makePPT() {
    
            System.out.println("制作PPT");
        }
    
        final void makeVideo() {
            System.out.println("制作视频");
        }
    
        final void makeArticle() {
            System.out.println("制作手记");
        }
    
        protected Boolean isNeedArticle() {
            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

    8.2 抽象接口子类

    public class JavaCourse extends ICourse{
        @Override
        void packageCourse() {
            System.out.println("JAVA 课程");
        }
    
        @Override
        protected Boolean isNeedArticle() {
            return true;
        };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    public class JavaScriptCourse extends ICourse{
        @Override
        void packageCourse() {
            System.out.println("javaScript 课程");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    8.3 实现类

    public class Test {
    
        public static void main(String[] args) {
    
            System.out.println("制作JAVA课程开始 start");
            ICourse course = new JavaCourse();
            course.makeCourse();
            System.out.println("制作JAVA课程开始 end");
    
            System.out.println("制作JAVASCROIPT课程开始 start");
            ICourse javaCourse = new JavaScriptCourse();
            javaCourse.makeCourse();
            System.out.println("制作JAVASCROIPT课程开始 end");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    模板方法起到保护作用,抽象保护的方法,已到达模板条件不一样的想过

    9. 源码解析

    9.1 AbstractList

     abstract public E get(int index);
    
    • 1

    9.2 HttpServlet

     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String msg = lStrings.getString("http.method_get_not_supported");
            this.sendMethodNotAllowed(req, resp, msg);
        }
    
    • 1
    • 2
    • 3
    • 4

    9.3 BaseExecutor

      protected void closeStatement(Statement statement) {
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException var3) {
                }
            }
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    10. UML

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ahhqjhm3-1667318793028)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221102000615153.png)]

  • 相关阅读:
    考研常识 | 专业硕士与学术硕士的11个区别
    深度学习面试题总结
    数据结构—List集合
    C++常用代码剖析
    The Linux Kernel ktime
    三天学会阿里分布式事务框架Seata-SpringCloud Alibaba分布式基础案例搭建
    python的多线程介绍之thread
    CPU的三级缓存
    【此时不应有 \anaconda3\envs\ blenderproc \Library\ssl\cacert.pem】问题已解决
    Effective C++条款22——将成员变置声明为private(设计与声明)
  • 原文地址:https://blog.csdn.net/hyzsuccess/article/details/127536637
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号