java设计模式(十三)模版方法模式(Template Method Pattern)

news2024/9/29 5:37:58

1、模式介绍:

模版方法模式是一种行为型设计模式,定义了一个操作中的算法框架,将一些步骤延迟到子类中实现。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

2、应用场景:

算法框架固定:当有一个算法有固定的框架但具体步骤可以有所不同时,可以使用模版方法模式。例如,开发一个网络库,其中连接、发送数据、关闭连接的顺序是固定的,但具体实现可能依赖于不同的网络协议。
代码复用:将公共操作抽象出来,避免代码重复。模版方法定义了算法的骨架,子类实现具体细节,提高了代码的复用性。
扩展性:通过模版方法模式,可以方便地扩展和修改算法的部分实现,而不需要修改整个算法的结构。

3、优点:

代码复用:将公共部分抽象到父类的模版方法中,避免重复代码。
灵活性:子类可以根据需要实现特定步骤,同时保持算法的整体结构不变。
扩展性:易于扩展新的算法步骤或者变体,通过子类扩展来实现。

4、缺点:

控制流程:模版方法模式在某种程度上限制了子类的灵活性,因为算法框架由父类控制,可能会导致类爆炸问题。
复杂性:过度使用模版方法可能会导致类的数量增多,增加代码复杂度。

5、代码示例:

/**
 * 抽象类:制作咖啡的模版
 *
 * @author FM_南风
 * @date 2024/7/3
 */
abstract class CoffeeTemplate {
    // 模版方法,定义咖啡的制作流程
    public final void makeCoffee() {
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 具体步骤的具体实现由子类提供
    abstract void brewCoffeeGrinds();
    abstract void addCondiments();

    // 公共步骤,具体实现是相同的
    void boilWater() {
        System.out.println("开水");
    }

    void pourInCup() {
        System.out.println("倒入杯中");
    }

    // 钩子方法,子类可以覆盖,控制算法的某些步骤
    boolean customerWantsCondiments() {
        return true;
    }
}

/**
 * 具体类:制作咖啡
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class Coffee extends CoffeeTemplate{
    @Override
    void brewCoffeeGrinds() {
        System.out.println("冲咖啡");
    }

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

    // 覆盖钩子方法,可以不加糖和牛奶
    @Override
    boolean customerWantsCondiments() {
        return false;
    }
}

/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/7/3
 */
public class TemplateMethodClient {
    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        coffee.makeCoffee();
    }
}

6、结果展示:

示例说明:

在上面的例子中,CoffeeTemplate 是一个抽象类,定义了制作咖啡的模版方法 makeCoffee(),并包含了公共步骤和钩子方法。Coffee 类是具体的咖啡类型,实现了特定的 brewCoffeeGrinds()addCondiments() 方法,以及钩子方法 customerWantsCondiments() 的覆盖。通过模版方法模式,实现了制作咖啡的通用框架,同时具体的制作细节由子类决定。

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

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

相关文章

开放式耳机哪个品牌最好?2024年度推荐前五来了

在蓝牙耳机的大家族里,开放式耳机就像是新发现的宝藏,专为那些追求舒适佩戴体验的朋友们量身定制。它们不钻进耳朵,不给耳道添堵,也不影响耳朵的健康,同时还能让你听到周围的声音,这样在享受音乐的同时&…

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux(Termux扩展) 1.1 切换源 注:可以将termux进行换源,最好采用国内源,例如:清华源等 更新包列表和升级包(可选&#xff0…

市场流行的蜗牛星际NAS和Think Pad X250硬件CPU等比较

当前二手市场流行的Mini服务器硬件是蜗牛星际NAS套件,流行的笔记本是Think Pad X230以及Think Pad X250,这里就比较下蜗牛和X250,因为它们都是低功耗、低运算的架构,至于神机Think Pad X230,它的速度太快,功耗太高&…

掌控Camunda:深入了解camunda-engine模块

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 掌控Camunda:深入了解camunda-engine模块 前言Camunda-engine模块概述简介架构设计设…

c语言数据结构--构造无向图(算法6.1),深度和广度遍历

实验内容: 实现教材算法6.2利用邻接矩阵构造无向图的算法,提供从邻接矩阵获得邻接表的功能,在此基础上进行深度优先遍历和广度优先遍历。 实验步骤: (1)按照实验要求编写代码,构造无向图。 …

[AI 快手 LivePortrait] 引领高效肖像动画新时代

快手推出了 LivePortrait,具有拼接和重定向控制的高效肖像动画。 快速开始 下载代码,准备环境 git clone https://github.com/KwaiVGI/LivePortrait cd LivePortrait# create env using conda conda create -n LivePortrait python3.9.18 conda activ…

mysql8多值索引

MySQL8新出了一个多值索引,我还没体验过呢,今天试一试。 建表 我先建个表试一试多值索引的效果。我粗略地看了下多值索引的介绍,发现是只适用于数组类型的。所以我建一个含有数组字段的表试一试。语法还是挺麻烦的: create tabl…

创建 ComfyUI 自定义节点的基本指南

ComfyUI 自定义节点基础教程 开始前的准备理解 ComfyUI 节点创建自定义节点1. 定义节点参数2. 实现节点逻辑3. 与 ComfyUI 集成 测试和改进节点结论 ComfyUI 是一个多功能的Stable Diffusion图像/视频生成工具,能够让开发者设计并实现自定义节点,扩展功能…

python库(9):prettytable库快速实现ASCII表格

下面介绍一个快速制作ASCII表格库——prettytable,可以方便地制作简单表格。 1 安装prettytable pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prettytable 结果如下: 2 代码实例 from prettytable import PrettyTable table PrettyTa…

arm架构安装chrome

在ARM架构设备上安装谷歌软件或应用通常涉及到几个步骤,这取决于你要安装的具体谷歌产品,比如谷歌浏览器、Google Play服务或者是其他谷歌开发的软件。下面我会给出一些常见的指导步骤,以安装谷歌浏览器为例: 在Linux ARM64上安装…

微软发布Win11 21H2七月更新补丁KB5040431,快来体验!

系统之家于7月10日发出最新报道,微软为Win11 21H2用户发布了七月的安全更新补丁KB5040431。用户升级系统后,会发现版本号升至22000.3079。此次更新针对远程桌面MultiPoint Server在争用条件会导致服务停止响应等多个问题进行修复。接下来跟随小编看看此次…

移动校园(9):uniapp照片上传,以及从nodejs服务器获取照片

后端: 安装中间件multer,刚好对应前端提交数据 npm install --save multer Multer详解(Node.js中间件)-CSDN博客 一直这样 又看了二个小时,搜遍全网,改了又改,各种测试,终于让我发现了问题&a…

哈喽GPT-4o,程序员如何通过GPT-4o提高办公效率

目录 一、编写工作汇报Prompt:我是一名Java开发工程师,请写一份工作总结,工作内容是一个SpringBootVue实现的图书管理系统,按下面的结构来撰写:1. 工作背景;2. 工作内容;3. 工作建议&#xff1b…

Golang期末作业之电子商城(源码)

作品介绍 1.网页作品简介方面 :主要有:首页 商品详情 购物车 订单 评价 支付 总共 5个页面 2.作品使用的技术:这个作品基于Golang语言,并且结合一些前端的知识,例如:HTML、CSS、JS、AJAX等等知识点,同时连接数据库的&…

【效率提升】多功能组织和整理软件一Notion

Notion下载地址:https://www.notion.so/desktop Notion 是一款多功能办公软件,非常适合进行知识整理、团队协作、项目整理等。 下面是几个我推荐Notion的关键点: 一、排版高度自由:Notion的页面可以嵌套,在页面中还支…

无线网的ip地址固定吗

在数字化日益普及的今天,无线网络已成为我们生活与工作中不可或缺的一部分。然而,对于许多非专业用户来说,无线网络背后的技术细节仍然充满了神秘感。其中,一个常见的问题是:无线网的IP地址是固定的吗?本文…

工厂水电燃气表流量计等能耗计量仪表非侵入式拍照抄表的方案

在企业园区、工厂等企事业单位,传统的手动抄表方式已逐渐不能满足现代化、信息化管理的需求。为了提高抄表工作的效率,减少人工操作的误差,同时保障数据的安全性和实时性,我们提出了拍照采集抄表方案。本方案旨在通过拍照的方式&a…

java使用poi-tl模版引擎导出word之饼状图生成及循环批量生成饼状图

文章目录 一、单个饼状图生成1.word模版制作2.编写接口完整代码3.导出结果 二、批量生成饼图1.word模版制作2.编写接口完整代码3.导出结果 一、单个饼状图生成 1.word模版制作 在word中创建一个饼状图,点击图表,点击“文本选项”,在可选文字…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页:电源感知等效性检查概述 ■ 第24页:启动低功耗(等效性检查)软件 ■ 第25页:电源感知等效性检查流程 ■ 第28页:电源感知等效性检查示例Do文件 电源感知等效性检查概述…

【4】A-Frame样例指南——完结

一、如何构建基本场景? 让我们从构建一个基本的 A-Frame场景开始。为此,我们需要对 HTML 有基本的了解。我们将学习如何: 使用原语添加 3D 实体(即对象) 通过位置、旋转、缩放来变换 3D 空间中的实体 添加环境 添加…