(十 三)趣学设计模式 之 模版方法模式!

在这里插入图片描述

目录

    • 一、 啥是模板方法模式?
    • 二、 为什么要用模板方法模式?
    • 三、 模板方法模式的实现方式
    • 四、 模板方法模式的优缺点
    • 五、 模板方法模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解享元模式请看: (十 二)趣学设计模式 之 享元模式!
✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的模版方法模式

一、 啥是模板方法模式?

想象一下,你想要制作一杯咖啡 ☕。 制作咖啡的步骤大致相同:烧水 💧、冲泡咖啡 ☕、倒入杯中 🥛、加入调料 🍬。 但是,不同的咖啡,加入的调料可能不同 (比如:拿铁加牛奶,美式加糖)。

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

简单来说,就是定义一个模板,规定了算法的执行流程,具体的实现细节由子类来完成! 📝

  • 你有一系列相似的算法,它们的执行流程基本相同: 就像制作不同口味的咖啡 ☕!
  • 你想让子类可以灵活地定制算法的某些步骤: 就像不同的咖啡可以加入不同的调料 🍬!
  • 你想避免代码重复: 就像你不想在每个咖啡类中都重复编写烧水、冲泡咖啡、倒入杯中的代码 💧☕🥛!

二、 为什么要用模板方法模式?

用模板方法模式,好处多多 👍:

  • 代码复用: 将公共代码提取到父类中,减少代码重复 ♻️!
  • 控制算法流程: 父类控制算法的执行流程,子类只能定制特定的步骤 📝!
  • 提高扩展性: 可以方便地添加新的算法,只需要创建新的子类即可 ➕!
  • 符合开闭原则: 可以在不修改父类代码的情况下,扩展算法的功能 ✅!

三、 模板方法模式的实现方式

模板方法模式主要包含以下几个角色:

  • AbstractClass(抽象类): 定义抽象的模板方法,以及一些具体的辅助方法。 ☕ (比如:咖啡基类)
  • ConcreteClass(具体类): 实现抽象类中的抽象方法,完成算法的特定步骤。 ☕ (比如:拿铁咖啡、美式咖啡)

代码示例:

// 抽象类:咖啡
public abstract class Coffee {
    // 模板方法:制作咖啡
    public final void makeCoffee() {
        boilWater(); // 烧水
        brewCoffee(); // 冲泡咖啡
        pourInCup(); // 倒入杯中
        addCondiments(); // 加入调料
    }

    // 具体方法:烧水
    private void boilWater() {
        System.out.println("烧水");
    }

    // 抽象方法:冲泡咖啡
    protected abstract void brewCoffee();

    // 具体方法:倒入杯中
    private void pourInCup() {
        System.out.println("倒入杯中");
    }

    // 抽象方法:加入调料
    protected abstract void addCondiments();
}

// 具体类:拿铁咖啡
public class LatteCoffee extends Coffee {
    @Override
    protected void brewCoffee() {
        System.out.println("冲泡拿铁咖啡");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入牛奶");
    }
}

// 具体类:美式咖啡
public class AmericanCoffee extends Coffee {
    @Override
    protected void brewCoffee() {
        System.out.println("冲泡美式咖啡");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入糖");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Coffee latte = new LatteCoffee(); // 创建拿铁咖啡
        latte.makeCoffee(); // 制作拿铁咖啡

        System.out.println("---");

        Coffee american = new AmericanCoffee(); // 创建美式咖啡
        american.makeCoffee(); // 制作美式咖啡
    }
}

分析:

  • Coffee 是抽象类,定义了制作咖啡的模板方法 makeCoffee(),以及一些具体的辅助方法 boilWater()pourInCup(),还有一些抽象方法 brewCoffee()addCondiments()
  • LatteCoffeeAmericanCoffee 是具体类,实现了抽象类中的抽象方法,完成了冲泡咖啡和加入调料的特定步骤。

输出结果:

烧水
冲泡拿铁咖啡
倒入杯中
加入牛奶
---
烧水
冲泡美式咖啡
倒入杯中
加入糖

四、 模板方法模式的优缺点

优点:

  • 代码复用 ♻️!
  • 控制算法流程 📝!
  • 提高扩展性 ➕!
  • 符合开闭原则 ✅!

缺点:

  • 增加了系统的复杂度 😫!
  • 抽象类定义了算法的骨架,子类必须遵循这个骨架,灵活性受到限制 ⛓️!
  • 每个不同的实现都需要定义一个子类,导致类的数量增加 📈!

五、 模板方法模式的应用场景

  • 你有一系列相似的算法,它们的执行流程基本相同: 就像制作不同口味的咖啡 ☕!
  • 你想让子类可以灵活地定制算法的某些步骤: 就像不同的咖啡可以加入不同的调料 🍬!
  • 你想避免代码重复: 就像你不想在每个咖啡类中都重复编写烧水、冲泡咖啡、倒入杯中的代码 💧☕🥛!
  • 数据库访问: 数据库访问的流程通常是:建立连接、执行查询、处理结果、关闭连接。 可以使用模板方法模式来定义这个流程,具体的查询语句和结果处理由子类来完成。
  • Servlet处理: Servlet处理请求的流程通常是:接收请求、处理请求、发送响应。 可以使用模板方法模式来定义这个流程,具体的请求处理由子类来完成。

六、 总结

  • 模板方法模式就像定义一个模板,规定了算法的执行流程,具体的实现细节由子类来完成! 📝
  • 主要包含抽象类和具体类两个角色! 🎭
  • 优点是代码复用、控制算法流程、提高扩展性、符合开闭原则! 👍
  • 缺点是增加复杂度、灵活性受到限制、类的数量增加! 👎
  • 适用于有一系列相似的算法,它们的执行流程基本相同,且需要让子类灵活地定制算法的某些步骤的场景! 🎯

希望这篇文章能让你彻底理解模板方法模式! 💯 祝你学习愉快! 😄

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车刹车系统设计

摘 要 本次设计内容为汽车刹车系统,其可靠性与驾驶人的生命息息相关,是汽车所有组成部分中最重要的一环。刹车系统是在车辆行驶过程中出现紧急情况时首先保护车辆与驾驶人员安全的反应系统,工作原理是依靠制动装置工作时产生的大量摩擦力来抵…

卷积神经网络梯度下降方向与参数更新方向的一致性论述

梯度下降是一种常用的优化算法,用于最小化损失函数,在机器学习和深度学习领域有着广泛的应用。分别对梯度下降、梯度方向以及参数更新采用负梯度方向的原因进行论述。 1.梯度下降 它的基本思想是通过迭代的方式来更新模型的参数,使得损失函数…

Starrocks入门(二)

1、背景:考虑到Starrocks入门这篇文章,安装的是3.0.1版本的SR,参考:Starrocks入门-CSDN博客 但是官网的文档,没有对应3.0.x版本的资料,却有3.2或者3.3或者3.4或者3.1或者2.5版本的资料,不要用较…

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站,想分享给大家。 在学习和工作的过程中,想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量,但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录 1. JVM内存模型2. 常量池中有什么类型?3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…

DeepSeek模型昇腾部署优秀实践

2024年12月26日,DeepSeek-V3横空出世,以其卓越性能备受瞩目。该模型发布即支持昇腾,用户可在昇腾硬件和MindIE推理引擎上实现高效推理,但在实际操作中,部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…

python编写liunx服务器登陆自动巡检脚本

前言: 用户需要一份用Python编写的Linux系统巡检脚本,检查内存、磁盘、CPU使用率,还有网络连通性。 首先,我得确定用户的使用场景。可能用户是系统管理员,需要定期监控服务器状态,确保系统正常运行。 或者…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏,本文将通过鸿蒙 ArkUI 框架的实现代码,逐步解析其核心技术点,包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块: ├── entry…

ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)

ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下:   Attributes文件夹保存特性类或过滤器类定义,主要包括:   …

Mysql表字段字符集未设置导致乱码问题

项目场景: 在使用mysql的text类型作为字段类型【未设置编码】,且表结构【设置了编码集】的条件下,查询表这个字段会出现乱码的情况。 问题描述 今日测试小伙伴给题主提出了一个bug,数据库当中的text文本字段在存储json的情况下&…

staruml绘制时序图和用例图

文章目录 1.文章介绍2.绘制用例图3.绘制时序图 1.文章介绍 之前,我们初步介绍了这个staruml软件的安装和如何使用这个软件对于uml类图进行绘制,当时我们是绘制了这个user类,实现了相关的接口,表示他们之间的关系,在今…

火狐浏览器多开指南:独立窗口独立IP教程

无论是跨境电商从业者需要管理多个店铺账号,还是海外社交媒体营销人员要运营多个社交平台账号,亦或是从事多账号广告投放的人员,都面临着一个共同的挑战 —— 如何高效管理多个账号,并确保每个账号的独立性。 在这种情况下&#…

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后,一场关乎数字世界秩序的攻防战正在上演:AI生成的深度伪造视频导致企业品牌声誉损失日均超千万,批量生成的侵权内容使版权纠纷量与日俱增,黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…

【论文精读】YOLO-World:实时开放词汇目标检测

论文地址: YOLO-World: Real-Time Open-Vocabulary Object Detection 源代码:YOLO-World 摘要 YOLO系列检测器因其高效性和实用性而被广泛认可。然而,它们依赖于预定义和训练过的物体类别,这限制了其在开放场景中的适用性。为了…

开放标准(RFC 7519):JSON Web Token (JWT)

开放标准:JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token (JWT) 是一种开放标准…

mysql架构查询执行流程(图解+描述)

目录 mysql架构查询执行流程 图解 描述 mysql架构查询执行流程 图解 描述 用户连接到数据库后,由连接器处理 连接器负责跟客户端建立连接、获取权限、维持和管理连接 客户端发送一条查询给服务器 服务器先检查查询缓存,如果命中缓存,则立…

k8s使用containerd作为容器运行时配置Harbor私有仓库与阿里云私有仓库以及镜像加速器,k8s基于containerd如何配置harbor私有仓库

至于containerd大家还需要在去学习以下使用的命令。 版本介绍 k8s:v1.28.2containerd:1.6.33 1.配置containerd镜像加速器 [rootmaster ~]# vim /etc/containerd/config.toml ---编辑containerd配置文件找到以下位置新添加 [plugins."io.contain…

【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南

文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type(访问类型)——查询性能的晴雨表典型场景分析: 2. key_len(索引使用长度)——索引利用率的检测仪计算示例: 3. Extra(附加信息&a…

python-leetcode-最长有效括号

32. 最长有效括号 - 力扣(LeetCode) class Solution:def longestValidParentheses(self, s: str) -> int:stack [-1] # 存储索引,初始值 -1 代表“未匹配起点”max_length 0for i, char in enumerate(s):if char (:stack.append(i)els…

单目摄像头物体深度计算基础原理

三维空间物体表面点位与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数,而相机参数的求解就是相机标定。 相机的参数矩阵包括内参和外参: 外参:决定现实坐标到摄像机坐标。…