深入理解设计模式之模板方法模式

news2024/9/25 7:20:21

深入理解设计模式之模板方法模式

在这里插入图片描述

什么是模板方法模式?

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板方法模式通过将算法的通用部分抽象出来,以模板方法的形式提供给子类,从而使得子类可以根据自身的需求来实现具体的步骤,同时保持算法的整体结构不变。

在模板方法模式中,通常包含一个抽象类和若干个具体子类。抽象类定义了算法的骨架,其中包含了一些抽象方法和具体方法。抽象方法由子类来实现,而具体方法则在抽象类中已经实现好了。

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

为什么需要使用模板方法模式?

使用模板方法模式可以将算法的通用部分抽象出来,提高代码的复用性和可维护性。当一个算法的不同步骤有共同的结构或者流程时,可以使用模板方法模式来避免重复的代码,并且方便后续的扩展和修改。

另外,模板方法模式还可以提供一种框架或者模板,使得子类只需要关注具体的实现细节,而不需要关心算法的整体结构。这样可以降低子类的复杂度,提高开发效率

怎么使用模板方法模式?

使用模板方法模式的步骤如下:

  1. 定义一个抽象类,其中包含算法的骨架,以及一些抽象方法和具体方法。抽象方法由子类来实现,具体方法在抽象类中已经实现好了
  2. 创建具体的子类,继承抽象类,并实现其中的抽象方法
  3. 在子类中根据具体需求重写抽象方法,完成算法的具体实现
  4. 在客户端代码中,通过实例化具体的子类来调用模板方法,从而完成算法的执行。

注意事项: 为防止恶意操作,一般模板方法都会用 final 关键词修饰

下面是一个简单的示例代码,演示了如何使用模板方法模式来实现一个简单的咖啡制作流程:

案例背景: 假设我们正在开发一个咖啡店的点单系统,系统中需要实现不同种类咖啡的制作过程。每种咖啡的制作过程都有一些共同的步骤,例如烧水、冲泡咖啡粉、加入调料等,但每种咖啡的具体步骤和调料可能有所不同。

解决方案: 我们可以使用模板方法模式来设计咖啡制作的过程。首先,我们定义一个抽象类CoffeeMaker,其中包含了制作咖啡的通用步骤,例如烧水、冲泡特定咖啡粉、倒入杯中和添加特定调料。然后,我们创建具体的子类,例如EspressoMakerLatteMaker,继承抽象类CoffeeMaker,并实现各自特定的步骤和调料。
在这里插入图片描述

// 抽象类CoffeeMaker,其中包含了制作咖啡的通用步骤
public abstract class CoffeeMaker {
    public void makeCoffee() {
        boilWater();
        brewCoffee();
        pourIntoCup();
        addCondiments();
    }

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

    public abstract void brewCoffee();

    public void pourIntoCup() {
        System.out.println("Pouring coffee into cup");
    }

    public abstract void addCondiments();
}

// 子类EspressoMaker浓缩咖啡,实现特定的步骤和调料
public class EspressoMaker extends CoffeeMaker {
    @Override
    public void brewCoffee() {
        System.out.println("Brewing espresso");
    }

    @Override
    public void addCondiments() {
        System.out.println("Adding sugar");
    }
}

// 子类LatteMaker拿铁咖啡,实现特定的步骤和调料
public class LatteMaker extends CoffeeMaker {
    @Override
    public void brewCoffee() {
        System.out.println("冲泡拿铁咖啡...");
    }

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

// 在客户端代码中使用模板方法模式
public class Client {
    public static void main(String[] args) {
        // 制作浓缩咖啡
        CoffeeMaker espressoMaker = new EspressoMaker();
        espressoMaker.makeCoffee();
        System.out.println("----------------------------");
        // 制作拿铁咖啡
        CoffeeMaker latteMaker = new LatteMaker();
        latteMaker.makeCoffee();
    }
}

在这里插入图片描述

总结:

模板方法模式是一种非常常用的设计模式,它可以帮助开发者更好地设计和组织代码,提高代码的可复用性和可维护性。通过将算法的通用部分抽象出来,以模板方法的形式提供给子类,可以使得子类可以根据自身的需求来实现具体的步骤,同时保持算法的整体结构不变。在实际的开发中,可以根据具体的需求来选择是否使用模板方法模式,以提高代码的效率和可维护性

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

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

相关文章

express学习笔记7 - docker跟mysql篇

安装Docker和Navicat Docker 进官⽹https://docs.docker.com/get-docker/ 选择机型安装即可。 Navicat(也可以在网上找个破解版本) 进官⽹https://www.navicat.com/en/products/navicat-premium 安装完之后连接新建⼀个数据库连接 然后再⾥⾯新建⼀个数…

【编程语言 · C语言 · 通讯录管理系统】

【编程语言 C语言 通讯录管理系统】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491539&idx1&sn02173f15bbff6d5f01a3426a1ecf7120&chksmcfade32af8da6a3cb187ecde99fe0519c4d67ef05488754ab2196fab0915262c260ccc68b304&payreadticketHEsQ…

MacOS使用brew如何下载Nginx

首先,第一步切换源: 切换 brew.git 仓库地址: cd "$(brew --repo)" git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git 替换 homebrew-core.git 仓库地址: cd "$(brew --repo)/Library/Taps/home…

无线蓝牙耳机有什么值得耳机买的?几款值得买的口碑品牌盘点

蓝牙耳机是一种无线耳机,其通过蓝牙技术与其他设备进行连接,例如手机、电脑、平板电脑等。蓝牙耳机使得用户可以在不受线缆限制的情况下享受音频体验,而且还可以方便地进行通话,目前市场上有许多不同种类和品牌的蓝牙耳机&#xf…

大厂原来都这么使用IDEA远程调试的!

远程调试是一项重要的技术,特别是对于使用IDEA开发的开发者来说。在本篇技术博客中,我们将探讨如何使用IDEA进行远程调试。 1 IDEA 配置 首先,我们需要确保我们的开发环境已经准备就绪。我们需要在远程服务器上安装并配置好调试器&#xff…

【福建事业单位-语言理解】02 细节判断-标题填入-词句理解

【福建事业单位-语言理解】02 细节判断-标题填入-词句理解 一、细节判断题细节判断优先验证原则总结 二、标题填入题总结 三、词句理解题3.1 代词指代实词理解句子理解总结 一、细节判断题 如果文段长难怪绕,就先看选项,反之一样。 面对温和的可能性表述…

java集成短信服务 测试版 qq邮箱简单思路

java集成短信服务 注册一个帐号 使用的是容联云,百度搜一下官网 用手机注册一个帐号就行,免费体验不需要认证 注册后会有八块钱送,可以使用免费的给自己设置三个固定手机号发送短信,不需要认证。 此页面的 三个信息需要在代码中…

免驱触摸屏为啥在我的Linux上驱动不起来

背景: 某宝上买了个HDMI接口的触摸屏,用树莓派驱动没啥问题,但是用在我自己定制的Linux系统上,咋都不好使,咨询商家,商家说触摸屏的芯片是GT911,芯片是I2c协议,触摸屏上是usb接口的…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了,为了更好的扩展Fiddler&#xff0c…

这9个UI设计工具一定码住!非常好用

对于设计师来说,好用的UI设计工具无疑会对设计工作起到事半功倍的作用,今天本文与大家分享9个好用的UI设计工具,一起来看看吧! 1、即时设计 即时设计是一个能在网页中直接使用,且支持团队协作的国产UI设计工具&#…

你的shell脚本存在安全问题吗?

更多技术资料,请关注微信公众号“运维之美” 信息安全对于线上环境显得尤为重要,shell脚本的代码中可能经常会引用到密码等变量进行赋值等场景,但是在使用的过程中可能会导致环境的登录信息泄露,导致安全隐患,那么如何…

ISO 7637-2 5a/5b抛负载测试保护用TVS二极管,如何选型号?

在国际标准ISO 16750-2颁布之前,全球各大汽车零部件制造商一直采用的是ISO 7637-2标准。ISO 16750-2国际标准发行之后,汽车抛负载浪涌测试中ISO 7637-2 5A和5B测试标准被ISO 16750-2测试标准取代。查看ISO 16750-2和ISO 7637-2国际标准文档资料对比会发现…

matlab编程实践16、17

捕食者与猎物模型 人口增长 在人口增长或衰减的最简单模型中,增长速度或衰减速度与人口本身的数目成正比。增加或减少人口规模会导致出生和死亡数量成比例地增加或减少。在数学上,可以由以下微分方程描述。 可以得出:,其中。 该简…

【mysql】Win10安装配置MySQL8.0简要

下载 MySQL官网下载安装包 安装

SpringBoot复习:(8)SpringBoot中是怎么判断应用类型是Servlet应用还是WebFlux应用?

在SpringApplication的构造方法里: 调用了WebApplicationType类的静态方法deduceFromClasspath, 该方法调用了ClassUtils类的isPresent方法来判断某个类是否能加载成功,首先判断,如果WebFlux相关的类能加载成功,就说明是WebFlux…

VGN N75pro说明书

VGN N75pro说明书 1、封面和最后一页 2、第01、02、03 3、第04 4、第05

可靠性工程师是做什么的?需要哪些能力?

一、可靠性工程师是做什么的? 官方解释,可靠性工程师是通过产品可靠性试验,进行性能评估,并预测如何改进产品或体系的安全性、可靠性、可维护性。 简单来说,客户在使用产品的过程中,会出现各种各样的质量…

【phaser微信抖音小游戏开发005】画布上添加图片

特别注意:真机模拟的时候,尽量使用网络图片资源,不要在小程序源文件里面使用图片,会出现真机加载不成功,小程序包体积过大的问题。我们学习过程中,只是作为演示使用。 推荐使用场景: 背景图片…

【硬件设计】模拟电子基础一--元器件介绍

模拟电子基础一--元器件介绍 一、半导体(了解)1.1 基础知识1.2 PN结 二、二级管2.1 定义与特性2.2 二极管的分类 三、三级管四、MOS管三、其他元器件管3.1 电容3.2 光耦3.3 发声器件3.4 继电器3.5 瞬态电压抑制器 前言:本章为知识的简单复习&…

安卓手机变身Linux服务器

文章目录 前言一、准备工作1、安卓手机2、下载软件二、开始安装1、检查系统,确认版本并安装2、配置(安卓7.0 及以上的用户忽略此步)3、问题处理【没有异常的小伙伴忽略】总结前言 在实际开发中有很多地方都需要服务器资源,但是服务器资源不论在哪里都是比较紧缺的资源,今…