java设计模式之模板模式(结合示例)

news2024/11/24 3:07:02

文章目录

  • 📋模板模式概念
  • 📖组成要素
    • 🔖代码示例
  • 📈总结

在这里插入图片描述

📋模板模式概念

在Java中,模板模式(Template Pattern)是一种行为设计模式,它定义了一个操作中的算法框架,并将某些步骤延迟到子类中实现。模板模式通过使用继承来提供算法的通用结构,同时允许子类在不改变算法结构的情况下重新定义其中的某些步骤。

📖组成要素

  • 模板模式由以下几个关键要素组成:
    1. 抽象模板(Abstract Template):定义了算法的基本结构和骨架,其中包含了一个或多个抽象方法或可选的钩子方法。
    2. 具体模板(Concrete Template):继承自抽象模板,并实现其中定义的抽象方法和钩子方法,完成算法中的具体步骤。
    3. 钩子方法(Hook Method):在抽象模板中可以定义的可选方法,子类可以选择性地覆盖或实现这些方法。

🔖代码示例

下面是一个示例,展示了如何使用模板模式来制作咖啡和茶:

/**
 * @Author: hrd
 * @CreateTime: 2023/7/26 11:13
 * @Description:
 */
public class TemplateDemo {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareBeverage();

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

        Beverage tea = new Tea();
        tea.prepareBeverage();
    }
}
// 抽象模板
abstract class Beverage {
    // 模板方法,定义了算法的基本结构和流程
    final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 具体步骤,由子类实现
    abstract void brew();

    // 具体步骤,由子类实现
    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 钩子方法,由子类选择性地覆盖
    boolean customerWantsCondiments() {
        return true;
    }
}

// 具体模板 - 咖啡
class Coffee extends Beverage {
    void brew() {
        System.out.println("Brewing coffee");
    }

    void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

// 具体模板 - 茶
class Tea extends Beverage {
    void brew() {
        System.out.println("Steeping tea");
    }

    void addCondiments() {
        System.out.println("Adding lemon");
    }

    // 覆盖钩子方法
    boolean customerWantsCondiments() {
        return false;
    }
}


在上述示例中,抽象模板Beverage定义了制作饮料的基本结构和流程,并将一些具体步骤(如brew()addCondiments())延迟到具体子类中实现。具体子类CoffeeTea分别继承自抽象模板,并实现了自己特定的步骤。customerWantsCondiments()是一个钩子方法,在茶的具体子类中选择性地覆盖。

通过模板模式,我们可以在不改变算法结构的情况下,灵活地定义和扩展特定类型的饮料制作过程。

📈总结

  • 在Java中,模板模式适用于以下场景:
    1. 定义算法的骨架:当一个算法具有固定的执行步骤和顺序,但其中某些步骤需要根据具体情况进行实现时,可以使用模板模式。这样可以将算法的通用结构定义在抽象模板中,而将可变的部分延迟到具体子类中实现。
    2. 共享公共行为:当多个类或对象之间具有相似的行为和操作,但又有一些差异时,可以使用模板模式来共享公共的行为。通过将公共行为提取到抽象模板中,避免了代码重复,并提供了一种灵活的方式来处理不同的差异。
    3. 控制子类扩展:模板模式可以用于限制子类的扩展。通过在抽象模板中声明关键方法为 final 或使用钩子方法来控制子类的行为,确保算法的整体结构不会被破坏。
    4. 框架和库设计:模板模式在设计框架和库时非常有用。它提供了一种基础架构,让用户能够根据自己的需求来扩展和实现特定的功能。
  • 需要注意的是,模板模式适用于那些具有固定结构和流程,并且存在可变部分的场景。它可以提供一种通用的算法框架,同时仍然允许子类灵活地定义和实现自己的行为。
  • 总结起来,模板模式在Java中适用于需要定义算法骨架、共享公共行为、控制子类扩展以及框架和库设计等场景。
  • 模板模式在Java中广泛应用于各种框架和库中,例如Servlet生命周期、JUnit测试框架等。它提供了一种可重用和可扩展的方式来定义算法的通用结构。

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

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

相关文章

Unity游戏源码分享-街机捕鱼2017版本

Unity游戏源码分享-街机捕鱼2017版本 完整的单机游戏 功能玩法,积分系统都已经齐全的了。 项目源码地址:https://download.csdn.net/download/Highning0007/88105459

音视频——帧内预测

H264编码(帧内预测) 在帧内预测模式中,预测块P是基于已编码重建块和当前块形成的。对亮度像素而言,P块用于44子块或者1616宏块的相关操作。44亮度子块有9种可选预测模式,独立预测每一个44亮度子块,适用于带有大量细节的图像编码&…

C语言中的函数(超详细)

C语言中的函数(超详细) 一、函数概述二、C语言中函数的分类1.库函数2.自定义函数三、函数的参数1.实际参数(实参)2.形式参数(形参)四、函数的调用1.传值调用2.传址调用五、函数的嵌套调用和链式访问1.嵌套调…

【手机】三星手机刷机解决SecSetupWizard已停止

三星手机恢复出厂设置之后,出现SecSetupWizard已停止的解决方案 零、问题 我手上有一部同学给的三星 GT-S6812I,这几天搞了张新卡,多余出的卡就放到这个手机上玩去了。因为是获取了root权限的(直接使用KingRoot就可以&#xff0…

C++ 提高编程

C 提高编程 主要针对C泛型编程和STL技术 一、 模板 1、 概念 模板就是建立通用的模具,大大提高代码的复用性 模板特点 模板不可以直接使用,它只是一个框架 ​ 模板的通用并不是万能的 2、 函数模板 C 另一种编程思想为泛型编程,主要利用的…

ChatGPT如何帮助学生学习

​ 一些教育工作者担心学生可能使用ChatGPT作弊。因为这个AI工具能写报告和计算机代码,画出复杂图表……甚至已经有许多学校把ChatGPT屏蔽。 研究发现,学生作弊的主要原因是想考得好。是否作弊与作业和考试的打分方式有关,所以这与技术的便…

浅谈前端跨平台框架

概述 前端跨端实践是指在开发过程中,使用统一的代码库或框架来实现在不同平台上运行的应用程序。 这种实践旨在减少重复开发和维护成本,并提高开发效率和用户体验。 以下是一些前端跨端实践的方法和技术: 响应式设计(Responsiv…

0-虚拟机补充知识

虚拟机克隆 如果想要构建服务器集群,没有必要一台一台的去进行安装,只要通过克隆就可以。 快速获得多台服务器主要有两种方式,分别为:直接拷贝操作和vmware的克隆操作 直接拷贝 将之前安装虚拟机的所有文件进行拷贝&#xff0…

聊聊单片机编程测量电机的电流

要测量电机的电流,可以使用电流传感器来实现。常见的电流传感器有霍尔效应传感器和电阻式传感器。 在单片机编程中,可以通过 ADC(模拟数字转换器)模块来实现对电流传感器输出电压的采样和转换。下面是一个简单的步骤:…

笔记本充满电后,充电器可以长期不拔,会有安全隐患吗?

笔记本充满电后,一直插着不拔 1.建议人在身边可以暂时不拔,偶尔还是要使用电池当笔记本电池充满之后,电脑会自动使用电源供电,不会使用电池供电 2.笔记本电池都带有电池保护机制,在电池充满电后会自动停止充电 3.现在…

Ceph的应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1)在管理节点创建 mds 服务2)查看各个节点的 mds 服务3)创建存储池,启用 ceph 文件系统4)查看mds状态,一个up,其余两个待命,目前的工作的…

Python - Opencv + pyzbar实时摄像头识别二维码

直接上代码: import cv2 from pyzbar.pyzbar import decodecap cv2.VideoCapture(0) # 打开摄像头while True: # 循环读取摄像头帧ret, frame cap.read()# 在循环中,将每一帧作为图像输入,使用pyzbar的decode()函数识别二维码barcodes …

gitignore文件使用方法(gitignore教程)(git status --ignored)(git check-ignore -v <file>)

文章目录 Gitignore文件使用描述Gitignore基本语法1. 基本语法★★★★★2. 配置方法 匹配示例示例1示例2示例3 其他命令git status --ignored&#xff08;用于显示被Git忽略的文件和文件夹的状态&#xff09;git check-ignore -v <file>&#xff08;用于检查指定文件是否…

springMVC--异常处理

文章目录 springMVC--异常处理基本介绍局部异常应用实例演示局部异常处理机制代码实现测试(页面方式) 全局异常应用实例应用实例需求代码实现完成测试(页面方式) 自定义异常应用实例应用实例需求应用实例-代码实现完成测试 全局异常处理---SimpleMappingExceptionResolver基本说…

Docker 阿里云容器镜像服务

阿里云-容器镜像服务ACR 将本地/服务器docker image&#xff08;镜像&#xff09;推送到 阿里云容器镜像服务仓库 1. 在容器镜像服务ACR中创建个人实例 2. 进入个人实例 > 命名空间 创建命名空间 3. 进入个人实例 > 镜像仓库 创建镜像仓库 4. 进入镜像仓库 > 基本信…

商品分类新建,修改,删除。手机扫码开单打印进销存,商贸批发生产企业仓库条码管理软件系统

商品分类新建&#xff0c;手机扫码开单打印进销存&#xff0c;商贸批发生产企业仓库条码管理软件系统&#xff0c;超市便利店五金茶叶烟酒鞋帽门店零售手机收银管理软件APP_哔哩哔哩_bilibili本期视频讲解&#xff1a;商品分类新建, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚…

小程序picker 在苹果手机不兼容 bug,按month时在iPhone 显示不正确及自动定位时间问题

如下图&#xff1a;点击弹出时间列表&#xff1a;日历控件点击选择显示1年1月 解决: 加上起始时间字段 <picker mode"date" value"{{date}}" start"1970-09-01" end"2030-09-01"></picker> 问题二&#xff1a; 还是&a…

vant-ui,DatetimePicker时间选择器选择到秒

vant-ui的DatetimePicker 组件只能选择年月日时分&#xff0c;可能是组件维护者认为秒的选择用途不多&#xff0c;但是今天的需求中就是需要选择年月日时分秒所以就对DatetimePicker的组件封装成了可以选择年月日时分秒&#xff0c;直接上代码&#xff1a; 封装成组件&#xf…

【电源芯片】电量计(Gauge)介绍

对于电池供电的产品,比如手机、笔记本电脑、电动车等,我们都希望知道其电池还剩多少电、还能用多久,以便我们能放心使用,避免使用过程中电量用光而宕机。并且客户已经受到智能手机影响,需要其他更低端的设备也能有1%的电量显示,不再像以前的小灵通或是诺基亚手机那样只会…

2 Linux基础篇-Linux入门

2Linux基础篇-Linux入门 文章目录 2Linux基础篇-Linux入门2.1 Linux介绍2.2 Linux和Unix的关系 学习视频来自于B站 【小白入门 通俗易懂】2021韩顺平 一周学会Linux。 2.1 Linux介绍 常见的操作系统有 Windows、MacOS、Android、ios、Linux、Unix等。而其中&#xff0c;Linux是…