模板模式(十六)

news2024/11/25 7:55:02

相信自己,请一定要相信自己

上一章简单介绍了代理模式(十五), 如果没有看过, 请观看上一章

一. 模板模式

引用 菜鸟教程里面的 模板模式介绍: https://www.runoob.com/design-pattern/template-pattern.html

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。

它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

一.一 介绍

意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

主要解决 一些方法通用,却在每一个子类都重新写了这一方法。

何时使用: 有一些通用的方法。

如何解决: 将这些通用算法抽象出来。

关键代码: 在抽象类实现,其他步骤在子类实现。

应用实例:
1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,
程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点: 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项: 为防止恶意操作,一般模板方法都加上 final 关键词。

image-20230615152323993

二. 模板模式应用

定义一个操作中算法的骨架,而将一些步骤延迟到子类中, 模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。

通俗点讲: 完成一件事情,有固定的数个步骤, 但是每个步骤根据对象的不同,而实现细节不同,
就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤云调用其每个步骤的实现方法。
每个步骤的具体实现,由子类完成。

二.一. 制作牛奶的例子

二.一.一 定义抽象类

@Slf4j
public abstract class Milk {

    public final  void make() {
        select();
        if (customerCondiments()) {
            addCondiments();
        }
        soak();
        beat();
    }
    void select() {
        log.info("第一步,选择好的黄豆");
    }

    // 添加信息,由子类去实现
    protected abstract void addCondiments();

    void soak() {
        log.info("第三步, 浸泡 3个小时");
    }

    void beat() {
        log.info("第四步: 打碎");
    }

    protected boolean customerCondiments() {
        return true;
    }

}

二.一.二 不同的实现

无任何添加的

@Slf4j
public class NoMilk extends Milk{
    @Override
    protected boolean customerCondiments() {
        return false;
    }

    @Override
    protected void addCondiments() {

    }
}

红豆的:

@Slf4j
public class RedDou extends Milk{

    @Override
    public void addCondiments() {
        log.info("第二步,添加红豆");
    }
}

花生的:

@Slf4j
public class HuaShengMilk extends Milk{

    @Override
    public void addCondiments() {
        log.info("第二步,添加花生");
    }
}

二.一.三 测试验证

@Test
    public void oneTest() {
        Milk milk = new HuaShengMilk();
        milk.make();
    }

    @Test
    public void twoTest() {
        Milk noMilk = new NoMilk();
        noMilk.make();
    }

image-20230615152712879

二.二 做饭例子

二.二.一 做饭抽象类

public abstract class Food {

    public  void cookFood() {
        preparation();
        make();
        put();
        eat();
    }


    protected abstract  void preparation();

    protected abstract  void make();

    protected abstract void put();
    protected abstract  void eat();
}

二.二.二 实现子类

做鱼

@Slf4j
public class Fish extends Food{

    @Override
    protected void preparation() {
        log.info(">>> 准备买好的,已经处理过的活,简单再处理");
    }

    @Override
    protected void make() {
        log.info("烧水,把鱼放进去");
    }

    @Override
    protected void put() {
        log.info("把鱼放盘子里面,端上来");
    }

    @Override
    protected void eat() {
        log.info("吃鱼");
    }
}

下面条:

@Slf4j
public class Noodles extends Food {

    @Override
    protected void preparation() {
        log.info("准备面条,切葱花,烧开水");
    }

    @Override
    protected void make() {
        log.info("把面条放置滚水里面");
    }

    @Override
    protected void put() {
        log.info("捞出来,放碗里");
    }

    @Override
    protected void eat() {
        log.info("开始吃面条");
    }
}

二.二.三 测试验证

@Test
    public void foodTest() {
        Food food = new Fish();
        food.cookFood();

        food = new Noodles();
        food.cookFood();
    }

image-20230615152946745

优点:

  1. 具体细节步骤实现在子类中,子类定义详细处理算法 是不会改变算法整体结构的。
  2. 代码复用的基本技术,在数据库设计中特别重要
  3. 存在一种反向的控制结构, 通过一个低头调用其子类 操作,通过子类对父类进行扩展增加新的行为,
    符合开闭原则。

缺点:

每个不同的实现都需要定义一个子类,会导致类的个数增加,系统会变得庞大。


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Template


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

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

相关文章

简要介绍 | 三维点云配准:理论、方法与挑战

三维点云配准:理论、方法与挑战 注:”简要介绍“系列仅从概念上对某一领域进行非常简要的介绍,不适合用于深入和详细的了解 三维点云配准 是计算机视觉和机器人领域的重要课题,涉及从不同视角或时间点采集的三维点云数据之间寻找最…

面试半年,总结了 1000 道 2023 年 Java 架构师岗面试题

半年前还在迷茫该学什么,怎样才能走出现在的困境,半年后已经成功上岸阿里,感谢在这期间帮助我的每一个人。 面试中总结了 1000 道经典的 Java 面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类&…

Linux5.5 Mysql索引、事务与存储引擎

文章目录 计算机系统5G云计算第四章 LINUX Mysql索引、事务与存储引擎一、Mysql索引1. 索引的概念2.索引的作用3.索引的副作用4.创建索引的原则依据5.索引的分类和创建1)普通索引2)唯一索引3)主键索引4)组合索引5)全文…

验证attention是否在图像分类问题上起决定性作用

来源:投稿 作者:摩卡 编辑:学姐 Motivation 现阶段出现了大量的Transformer-style图像分类模型,并且这些模型在ImageNet上取得了不俗的成绩,这些Transformer-style模型将取得高性能的功劳归功于Multi-head attention注…

【软件设计】模块设计耦合的其中类型

一.什么是高内聚、低耦合? 在结构化分析与模块设计方法中,模块化是一个很重要的概念,它是将一个待开发的软件分解成为若干个小的模块,每个模块可以独立地开发、测试。使得复杂问题的“分而治之”,令程序的结构清晰、易…

vue3+router4的基本使用

一、安装router npm i vue-router二、路由跳转 2.1 创建路由实例 在src目录下创建router文件夹,在其中创建一个index.js文件,创建路由实例。 通过vue-router的createRouter方法创建一个router对象。其中有history和routes 1.history: histo…

微机保护的数据采集系统(2)

(二)采样保持电路(S/H)和模拟低通滤波器(ALF) 1.采样保持电路(S/H) (1)采样保持原理。 S/H电路的作用是在一个…

Linux进程间通信 - 共享内存

之前的文章中我们讲述了匿名管道与命名管道相关的知识点,在本文中我们将继续讲述一种进程间通信的方式:共享内存。 systemV共享内存 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到…

Downie 4 4.6.18 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

间接采购管理中常见的五大挑战

间接采购,有时也被称为间接费用或尾部支出,这些商品或服务不是制造产品直接必需的,而是日常运营所需的。 ● 办公室和行政用品 ● 商店地点的消耗品(例如,清洁用品) ● 设施管理费用 ● 专业服务 ● 旅行…

Linux 服务器重启之后执行指定脚本文件

有些时候,我们部署服务、中间件、数据库等应用的机器可能会因为机房停电、断电而宕机,这样大部分服务就随之关闭了,可能会需要手动去进行重启,我们可以通过 Linux 的开机启动来实现服务自动重启。 一、配置 /etc/rc.d/rc.local 文…

VOSviewer软件的基础与应用

VOSviewer是一款免费且专业的文献计量分析软件,也是一个知识图谱可视化工具,由荷兰莱顿大学开发,主要用于构建和查看文献计量知识图谱,基于文献的共引和共被引原理,具有可视化能力强、适合于大规模样本数据的特点&…

抖音矩阵系统源代码开发部署--源码搭建

抖音矩阵系统是一个具有强大功能的开放性平台,通过数据挖掘技术能够实现精准的用户画像和个性化推荐,这也是抖音成为国内最受欢迎的短视频平台之一的原因之一。矩阵系统的开发需要大量的技术支持和数据分析,同时也需要综合运用大数据、机器学…

Mysql主从复制及读写分离

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

华为OD机试 JavaScript 实现【密码验证合格程序】【牛客练习题 HJ20】,附详细解题思路

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行) 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出:OK&…

A stochastic parrot in every pot 每口锅里都会有一只随机鹦鹉? | 经济学人社论双语精翻

本期双语文章来自《经济学人》2023年5月13日周报社论:《人工智能经济学》(The economics of AI) A stochastic parrot in every pot? 每口锅里都会有一只随机鹦鹉? What does a leaked Google memo reveal about the future of A…

软文营销,如何写出优质的新闻稿

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 一,什么是软文营销? 软文营销是一种通过撰写和发布具有信息性、有趣性和可读性的文章,来推广产品、服务或品牌的营销策略。软文是指以一种较为隐晦、…

【默认端口】市面上各种中间件、软件、服务的默认端口汇总

常用软件,中间件,服务的默认端口汇总 常用软件默认端口汇总 市面上各种中间件、软件和服务的默认端口众多,下面列举一些常见的默认端口: SSH(Secure Shell):22 Telnet:23 FTP…

AI在零售行业的应用

原创 | 文 BFT机器人 如今,零售商已经体验到使用人工智能 (AI) 的诸多好处,随着行业不断创新,人工智能的重要性只会越来越大。随着人工智能越来越被广泛接受,它的实施也越来越广泛。 查看这些用例,了解零售业中的 AI如…

一文掌握linux基本操作命令

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…