图解设计模式:Teamplate Method 模板方法模式 由子类实现具体内容的模式

news2025/2/25 12:40:18

前言

📣 📣 📣 📢📢📢
☀️☀️点开就是缘分认识一下,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。
📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具
📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章
📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习
✏️高质量技术专栏专栏链接: 微服务数据结构netty,单点登录,SSMSpringCloudAlibaba
😝公众号😝想全栈的小冷,分享一些技术上的文章,以及解决问题的经验
当前专栏设计模式系列
专栏代码地址: 代码地址

模板方法模式 Teamplate Method

什么是模板? 可以理解为有镂空的塑料板,我们可以用笔去透过模板的镂空汇出整齐的字 ,

了解模板方法模式

​ 我们这次要实现的模板方法模式是带有模板功能的模式,组成模板的方法被定义在父类中,由于这些方法是抽象方法,只查看父类的代码实无法知道这些方法最后进行何种具体的处理。唯一可以知道的是父类如何调用这些方法的

实现上述这些抽象方的是子类,在子类中实现了抽象方法也就决定了具体的处理,不同的子类实现不同的具体处理,当父类模板方法被调用的时候程序执行的行为也会出现不同也就是说:

  • 父类定义方法和流程
  • 子类完成具体方法的实现

示例程序

类表

image-20221216193118511

类图

AbstractDisplay类定义了 四个方法 其中display方法 依次调用了 open print close 三个方法,这三个方法虽然在AbstractDisplay中已经声明,但是没有实际上的实现,这个调用抽象方法的display方法就是模板方法

image-20221216194703111

抽象模板类

AbstaractDisplay

作为模板类(父类)它定义了需要实现的抽象方法和执行流程

public abstract class AbstaractDisplay {
        //子类实现
        public abstract void  open();
        public abstract void  print();
        public abstract void  close();

        //执行流程
        public final void  display(){
            open();
            for (int i = 0; i <5 ; i++) {
                print();
            }
            close();
        }
}

子类 CharDisplay

作为子类 继承模板类并且重写方法

public class CharDisplay extends AbstaractDisplay {
    //需要显示的字符
    private char ch;

    public CharDisplay(char ch) {
        this.ch = ch;
    }


    //重写父类方法
    @Override
    public void open() {
        System.out.print("<<");
    }

    @Override
    public void print() {
        System.out.print(ch);
    }

    @Override
    public void close() {
        System.out.println(">>");
    }
}

子类 StringDisplay

使用字符串来输出内容,并且用printline来改变格式

public class StringDisplay extends AbstaractDisplay {
    private String string;
    private int width;

    public StringDisplay(String string) {
        this.string = string;
        this.width = string.getBytes().length;
    }

    //实现父类方法
    @Override
    public void open() {
        printline();
    }

    @Override
    public void print() {
        System.out.println("|" + string + "|");
    }

    @Override
    public void close() {
        printline();
    }

    private void printline() {
        System.out.print("+");
        for (int i = 0; i < width; i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}

示例测试

public class test {
    public static void main(String[] args) {
        AbstaractDisplay charDisplay = new CharDisplay('H');
        AbstaractDisplay stringDisplay = new StringDisplay("hello word");
        AbstaractDisplay stringDisplay1 = new StringDisplay("你好世界");
        charDisplay.display();
        stringDisplay.display();
        stringDisplay1.display();
    }
}

image-20221216200803973

模板方法中的角色

  • 抽象类 不仅定义模板方法display 还负责声明方法中所需要的抽象方法
  • 具体类 重写抽象类中定义的抽象方法,来达到调用不同子类实现走统一流程但是不同效果的目的

拓展思路

模板方法给我们带来的什么好处呢? 他的优点是什么? 其实在示例过程中就已经很明显了

流程是定义在父类中的, 假如父类的模板方法里加入了算法,子类也无需去关心。

假如我们没有模板方法 那么就会编写许多个实现类每个类都有自己的display,万一某个类的display出了什么问题 编写完如果没有bug还好 要是一段时间之后,我们发现有bug 该如何,我们就必须将使用这个模板类所有的地方修改才能解决,如果使用了模板方法 只需要修改抽象类中的模板方法就可以了

在实例中 我们用final来修饰模板方法表示子类无法重写这个方法 也就不会影响到父类模板方法的执行

父类子类的协作性

在上面的示例就可以看出来 不管是char的实现还是stirng的实现模板方法的 父子类工作室紧密相连的,在不知道父类模板方法的情况下想要实现子类是很困难的事情

父子类的一致性

在示例程序中 不管是子类有多少,都是保存在抽象类的类型变量中在调用模板方法,父类变量保存子类的优点就是不管是保存到哪个子类的示例,程序都可以正常工作,折中原则被称为里氏替代原则

父类对子类的要求

在我们理解的类层次中,往往都是从子类来进行思考的

  • 子类中可以使用父类的方法
  • 可以通过子类增加方法来实现新的功能
  • 在子类重写父类方法可以改变程序行为

现在我们改变一下日常 站在父类的角度进行思考,在父类中 我们声明了抽象方法,将该方法的实现任务交给了子类,就程序而言声明抽象方法是希望达到一些目的: 要求子类去时间抽象方法

这种方式被称为子类这人

父类子类之间的写作

模板方法模式 是父子类一起支撑一个程序,通过让父类少一些实现 让子类多一些实现的方式来增强了子类的灵活性 同时有模板方法的存在划分了父子类的任务需求 父类负责定义方法和流程 子类负责具体方法实现,不过如何划分 是由我们开发者来决定 这些需要我们根据经验来决定

拓展示例

去哪里可以看到模板方法呢 ?

在java.io的inputstream中就可以看到对模板方法的使用

image-20221216203155540

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT的博弈:一场猫捉老鼠的游戏画上句号

前言 上周日我在B站发了个视频(https://www.bilibili.com/video/BV1Ud4y1e7BP)&#xff0c;本来想水一期的(毕竟一个半月没更新了)&#xff0c;不过借着ChatGPT的热度&#xff0c;播放量突破2w。 随之而来的是大批网友涌入群聊&#xff0c;想测验一下ChatGPT的性能&#xff0…

手把手教你在Ubuntu定制文件系统

为了给客户的测试和开发提供便利&#xff0c;飞凌嵌入式的开发板产品一般都支持多种操作系统&#xff0c;以基于全志T507H处理器设计研发的OKT507-C开发板为例&#xff0c;它支持三种操作系统&#xff0c;分别是&#xff1a;Linux、Android 和 Forlinx Desktop&#xff08;Ubun…

招聘惊现997工作要求!HR:因为下班比较晚,所以公司一般不加班

对于程序员来说&#xff0c;加班就像阳光和空气&#xff0c;实在是太正常不过的事情了。 就算本身并不是需要加班的公司&#xff0c;在项目上线的前夕多多少少肯定还是需要加一些班的&#xff01; 但是&#xff0c;下面这家公司就不一样了&#xff0c;直言公司就是997工作制……

Centos 配置磁盘加密(crypt-disk)

文章目录 Crypt-disk 创建一块新的磁盘,启用磁盘加密,解锁密码为“CSK2022!”; 映射到/dev/mapper/crypt 分区,并挂载到/mut/crypt 目录。一、去虚拟机添加一块磁盘二、安装cryptsetup2.对/dev/sdb 进行加密操作3.映射加密磁盘4.格式化5.挂载到到/mut/crypt 目录。题目 Cry…

Pytest测试框架(二):fixture 方法等相关操作--自定义测试用例的前置后置条件

pytest中的fixture&#xff1a; fixture是pytest特有的功能&#xff0c;它用pytest.fixture标识&#xff0c;定义在函数前面。fixture有明确的名字&#xff0c;在其他函数&#xff0c;模块&#xff0c;类或整个工程调用它时会被激活。fixture是基于模块来执行的&#xff0c;每个…

如何用C#制作 微信个人机器人

打包下载..https://github.com/wechaty/dotnet-wechaty在windows上安装docker&#xff0c;由于可能不是专业版windows10&#xff0c;可能会遇到一系列问题&#xff0c;百度能解决。可以参考 win10安装docker&#xff08;适用于windows家庭版&#xff09;_一起玩编程的博客-CSDN…

基于jsp+mysql+SSM学生兼职信息网站-计算机毕业设计

项目介绍 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 硬件环境&#xff1a; windows 7/8/10 1G内存以上 管理员角色…

系统的混乱并非业务本身之复杂,我们并不擅长处理『简单』

作者&#xff1a;聂晓龙 一、前言 一群高智商青年在餐厅吃饭&#xff0c;餐桌上一个瓶盖标识为盐的瓶子里装的是胡椒粉&#xff0c;而标识为胡椒粉的瓶子里装的却是盐&#xff0c;他们想出了一个充满才气的方案来完成对调--仅需要一张餐巾纸、一根吸管和两个空碟子。当他们叫来…

Jmeter 性能测试入门 ——性能插件介绍

目录 一、前言 1、首先&#xff0c;JMeter提供了三个基本的线程组&#xff0c;分别为: 2、其他线程组可以通过集成插件的方式使用&#xff0c;包括&#xff1a; 二、集成插件下载安装 1、下载地址&#xff1a;jmeter-plugins.org 2、安装&#xff1a;下载后文件为plugins…

nodejs+vue015疫情社区管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.3 B/S结构 4 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可…

Python自学教材推荐 初学者必看

Python是一种面向对象、解释性的高级程序语言&#xff0c;它已经被应用在众多领域&#xff0c;因此学习Python变得越来越有必要。传智播客针对编程零基础的初学者&#xff0c;编著出版了高质量的Python自学教材——《Python快速编程入门》。下面我将把这本书推荐给大家&#xf…

陈天老师的Rust培训(1)学习笔记

https://tyrchen.github.io/rust-training/ 跟C互操作时&#xff0c;加上上面图片的宏&#xff0c;rust会根据你的各个域的内存的占用自动去调整内存中的位置&#xff0c;让你的内存占用是最优的&#xff0c;而且rust在生成数据结构的结构的时候&#xff0c;它会做一些padding&…

新零售@2022: 调料、精酿、预制菜

【潮汐商业评论/原创】 圣诞节临近&#xff0c;刚刚下班的Emily想着好久没有与闺蜜见面了&#xff0c;于是相约着过平安夜。 她顺手就打开盒马APP下单了适合女生的微醺精酿&#xff0c;同时发现零售平台上新了一款可以用来拌蔬菜的中式沙拉川式椒麻汁&#xff0c;想起中午做饭…

常见音视频编码格式

1、常见的音频编码格式 MP3 这种压缩方式的全称叫MPEG Audio Layer3,MP3是利用MPEG Audio Layer 3的技术&#xff0c;将音乐以1:10甚至1:12 的压缩率&#xff0c;压缩成容量较小的file&#xff0c;换句话说&#xff0c;能够在音质丢失很小的情况下把文件压缩到更小的程度。而且…

收获一个python识别率超级高的OCR包,值得推荐

他的开源项目地址&#xff1a;https://github.com/sml2h3/ddddocr 他支持的类型还是挺多的&#xff1a; 本次更新新增了两种滑块识别算法&#xff0c;算法非深度神经网络实现&#xff0c;仅使用opencv和PIL完成。 算法1 小滑块为单独的png图片&#xff0c;背景是透明图&…

大一新生HTML期末作业——大学生抗疫感动专题网页设计作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

栈,队列和链表三者之间的关系与区别

最近一直在学习算法&#xff0c;刷算法题&#xff0c;但是自从大学毕业以来&#xff0c;数据结构的知识都还给老师了&#xff0c;只会个数组&#xff0c;所以前期刷的题目也都是有关数组的 最近跟着小册重学了一遍数据结构&#xff0c;今天就记录一下栈,队列和链表三者之间的关…

MindFusion.Diagramming for JavaScript V4.2.4

MindFusion.Diagramming for JavaScript V4.2.4 现在支持使用套索工具进行缩放的多种方式。2022 年 12 月 15 日 - 15:44新版本特征 套索缩放工具- 该控件现在支持使用套索工具进行缩放的多种方式。新的“PanAndModify”行为允许您在鼠标指针悬停在某个项目上或平移视图时进行选…

HTTPS工作过程!

HTTPS了解 HTTPS 也是一个应用层协议&#xff0c; 是在 HTTP 协议的基础上引入了一个加密层。HTTP 协议内容都是按照文本的方式明文传输的&#xff0c; 这就导致在传输过程中出现一些被篡改的情况。如运营商劫持。 HTTPS工作过程 ① 既然要保证数据安全, 就需要进行 “加密”。…

【python】如何把你的python包发布出去(pip install)

python&#xff1a;如何把你的python包发布出去&#xff08;pip install&#xff09; 介绍 实际上分为两步 打包发布 我们要发布的网站是https://pypi.org/。也就是用户通过pip install XXX&#xff0c;就可以安装你的包。 1 通过setuptools打包 需要我们编写setup.py f…