模板方法模式:简化代码,提高复用性

news2024/11/24 13:20:07

在软件开发中,我们经常会遇到一些算法或业务流程,其中的步骤或顺序是固定的,但某些步骤的具体实现方式可能会有所不同。这时,模板方法模式就能派上用场。模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将某些步骤的具体实现延迟到子类中。通过模板方法模式,我们可以在不改变算法结构的情况下,灵活地定制算法中的某些步骤,从而简化代码的编写,提高代码的复用性。

模板方法模式的结构

 模板方法模式由以下几个角色组成:

  • 抽象类(AbstractClass):抽象类定义了算法的骨架,其中包含了一系列的抽象方法和具体方法。抽象方法由子类实现,具体方法在抽象类中已经实现,但可以被子类进行重写。
  • 具体类(ConcreteClass):具体类继承抽象类,并实现了其中的抽象方法。

下面是一个简单的示例,通过制作咖啡和茶来演示模板方法模式的应用。

// 抽象类:饮料制作
public abstract class Beverage {
    // 模板方法,定义了制作饮料的算法骨架
    public final void prepareBeverage() {
        boilWater();
        brew();
        pourIntoCup();
        addCondiments();
    }

    // 抽象方法,由子类实现
    protected abstract void brew();

    // 抽象方法,由子类实现
    protected abstract void addCondiments();

    // 具体方法,已经在抽象类中实现,但可以被子类重写
    protected void boilWater() {
        System.out.println("Boiling water");
    }

    // 具体方法,已经在抽象类中实现,但可以被子类重写
    protected void pourIntoCup() {
        System.out.println("Pouring into cup");
    }
}

// 具体类:咖啡
public class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Brewing coffee");
    }

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

// 具体类:茶
public class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping tea");
    }

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

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareBeverage();

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

        Beverage tea = new Tea();
        tea.prepareBeverage();
    }
}

在上面的示例中,Beverage是抽象类,定义了制作饮料的算法骨架,其中包含了prepareBeverage方法作为模板方法。CoffeeTea是具体类,继承了Beverage并实现了其中的抽象方法。通过调用prepareBeverage方法,我们可以制作出不同的咖啡和茶,而具体的步骤和顺序则由抽象类和具体类来定义。

模板方法模式的优点

模板方法模式具有以下几个优点:

  1. 代码复用:模板方法模式将相同的代码放在抽象类中实现,可以被多个具体类共享,避免了重复编写相同的代码。
  2. 易于扩展:通过添加新的具体类,我们可以很容易地扩展算法的实现,而无需修改抽象类中的代码。
  3. 封装不变部分:模板方法模式将算法的骨架封装在抽象类中,确保了算法的一致性和稳定性。具体类只需要关注自己需要实现的具体步骤。
  4. 灵活性:模板方法模式允许具体类根据需要重写抽象类中的方法,从而灵活地定制算法的实现。

模板方法模式的适用场景

模板方法模式适用于以下情况:

  1. 当多个类具有相同的算法骨架,但其中某些步骤的具体实现可能不同。
  2. 当希望通过固定算法的结构,灵活地定制某些步骤的具体实现。
  3. 当希望在不改变算法结构的情况下,对算法的某些部分进行扩展或修改。

模板方法模式在实际的软件开发中有广泛的应用,例如:

  • 在框架中,我们可以使用模板方法模式定义框架的基本算法和流程,而将具体的实现留给框架的使用者。
  • 在设计模式中,模板方法模式被广泛用于定义一些通用的算法和流程,例如在Java的java.util.AbstractListjava.util.AbstractSet中就使用了模板方法模式。

总之,模板方法模式是一种简化代码、提高复用性的设计模式。通过将算法的骨架定义在抽象类中,具体的实现交给子类来完成,我们可以在不改变算法结构的情况下,灵活地定制算法的具体实现。这种模式的应用可以使我们的代码更具可维护性和可扩展性,提高软件开发的效率。

公众号请关注"果酱桑", 一起学习,一起进步!

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

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

相关文章

环肽科研试剂:161552-03-0,Cyclo(-Arg-Gly-Asp-D-Phe-Lys),IC50为0.94nM

资料编辑|陕西新研博美生物科技有限公司小编MISSwu 五元环肽Cyclo(-Arg-Gly-Asp-D-Phe-Lys) (CAS号:161552-03-0),是αvβ3整联蛋白的有效和选择性抑制剂,IC50为0.94nM。可以高放射化学纯度(>97&#xf…

高数笔记2(第一章函数 极限 连续-无穷小量与无穷大量)

目录 二、无穷小量与无穷大量概念 (1)无穷小的概念(2)无穷小的性质无穷个无穷小的和不是无穷小-证明无穷个无穷小量的乘积不是无穷小-证明(没看懂)无穷小量与有界量的乘积仍是无穷小-证明 (3&am…

IIS部署vue项目刷新404问题

在dist目录下新建web.config文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"Handle History Mode and custom 404/500" stopProcessing"t…

前端(六)——TypeScript在前端中的重要性与应用

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;TypeScript在前端中的重要性与应用 文章目录 什么是TypeScript&#xff1f;TypeScript与JavaScript的关系如何使用TypeScriptTypeScript在前端开发中的应用场景提升开发效率减少错误和调试时间优化…

剑指offer04:在有序二维数组中查找某个数字

文章目录 一、题目描述二、解题思路与代码实现1.解题思路2.代码实现 一、题目描述 二、解题思路与代码实现 1.解题思路 方法一&#xff1a; 暴力遍历&#xff0c;可以做剪枝操作&#xff0c;如果遍历的数字大于target&#xff0c;就直接break。 方法二&#xff1a; 二分查找…

javaweb使用Thymeleaf 最凝练的CRUD项目-下

javaweb使用Thymeleaf 最凝练的CRUD项目-下 10、执行保存 ①目标 提交表单后&#xff0c;将表单数据封装为Soldier对象&#xff0c;然后将Soldier对象保存到数据库。 ②思路 ③代码 [1]Servlet方法 protected void saveSoldier(HttpServletRequest request, HttpServletR…

第三方api对接怎么做?淘宝1688api接口怎么对接?

在今天的互联网上&#xff0c;第三方API对接是必不可少的。这种技术将不同的应用程序/服务连接在一起&#xff0c;创造了无限的可能性。 第三方api对接怎么做&#xff1f; 1、与支付公司签约 首先&#xff0c;通过正规的渠道&#xff0c;如支付公司官网或正规服务商&#xf…

spring boot学习第二篇:spring boot2.6.4版本启动接口服务

1、先启动好 参考我的spring boot学习第一篇文档&#xff1a;spring boot 1.5.x版本启动接口服务_veminhe的博客-CSDN博客 需要改动2个地方 pom.xml里面 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…

第八章 SSD 电源管理

从 SATA 链路、PCIe 链路、NVMe 协议以及 SSD 内部主控管理等方面介绍 SSD 上的电源管理技术。 8.1 SATA 省电模式 Partial 和 Slumber PHY&#xff1a;物理层。 1. SATA 提供了两种低功耗模式&#xff0c;Partial 和 Slumber&#xff1a; &#xff08;1&#xff09; Part…

复习Javascript数组

JavaScript 数组 JS 数字属性JS 数组方法 JavaScript 数组用于在单一变量中存储多个值。 var cars ["Saab", "Volvo", "BMW"]; 什么是数组&#xff1f; 数组是一种特殊的变量&#xff0c;它能够一次存放一个以上的值。 如果您有一个项目清…

[GFCTF 2021]Baby_Web(CVE-2021-41773) 从一道题入门PHP代码审计 (保姆级)

[GFCTF 2021]Baby_Web(CVE-2021-41773) 题目标签&#xff1a;WEB、PHP、CVE-2021-41773、变量覆盖 做后考点总结&#xff1a;CVEPHP中量代码审计 CVE-2021-41773是一个Apache Httpd Server 路径穿越漏洞 详情见&#xff1a;CVE-2021-41773_Jay 17的博客-CSDN博客 在源码中…

Docker安全开放远程访问连接权限

1、Docker完全开放远程访问 Docker服务完全开放对外访问权限操作如下&#xff1a; # 开启端口命令 &#xff08;--permanent永久生效&#xff0c;没有此参数重启后失效&#xff09; firewall-cmd --zonepublic --add-port2375/tcp --permanent # 重新载入 firewall-cmd --re…

模型与计算平台

说明&#xff1a;部分内容摘自参考文献&#xff0c;如有侵权&#xff0c;联系删除 模型概念 计算量 FLOPs FLOPs&#xff1a;floating point operations 指的是浮点运算次数&#xff0c;理解为计算量&#xff0c;可以用来衡量算法/模型时间的复杂度, 单位是 FLOPs。FLOPS&…

【Arduino小车实践】陀螺仪的使用

一、MPU6050简介 MPU6050是一款陀螺仪模块&#xff0c;可以测量X、Y、Z三轴的角速度和加速度&#xff0c;还带有温度传感器和数字运动处理器(DMP)。 二、学习步骤 1. I2C协议 MPU6050是通过I2C协议进行驱动的&#xff0c;配置寄存器和获取数据都需要通过I2C协议去实现开发板与…

OpenMMLab MMTracking目标跟踪环境搭建(一)

1、环境搭建 创建conda虚拟环境并激活。 conda create -n mmtrack python3.8 -y conda activate mmtrack 按照官方说明安装 PyTorch 和 torchvision 可以通过指定版本号切换到其他版本。 #如果网不好&#xff0c;可以这样安装 pip3 install torch1.8.2cu102 torchvision0.9…

基于SpringBoot+vue的校园闲置物品租售系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

postman:模拟发送一个需要 cookie 认证的请求

目录 前言&#xff1a; 1、chrome 已安装插件 intercept。 2、chrome 浏览器要设置打开&#xff0c;在运行期间浏览器要一直打开。 3、本人是用 fiddler 对 app 的请求进行抓包&#xff0c;也可以使用其他工具。查看 headers 里的 cookie&#xff0c;并复制。 4、将复制的…

Ubuntu安装zsh主题

安装zsh sudo apt install zsh安装git&#xff08;如果有跳过&#xff09; sudo apt install git(1条消息) 关于Git这一篇就够了_17岁boy想当攻城狮的博客-CSDN博客 安装oh my zsh git clone https://github.com/robbyrussell/oh-my-zsh切换目录到oh-my-zsh文件夹下的tools…

0基础学习VR全景平台篇 第62篇:通用功能-通用设置

公开&#xff1a;公开表示该作品对所有人可见&#xff0c;并且会在蛙色VR平台和个人主页显示。点击公开会切换成私人模式&#xff0c;私人则表示只有作者本人可以访问&#xff0c;他人即使获取了链接也无法打开。 预览&#xff1a;点击“预览”可以查看VR视频的效果&#xff0…

【LeetCode热题100】打卡第37天:岛屿数量反转链表

文章目录 【LeetCode热题100】打卡第37天&#xff1a;岛屿数量&反转链表⛅前言 岛屿数量&#x1f512;题目&#x1f511;题解 反转链表&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第37天&#xff1a;岛屿数量&反转链表 ⛅前言 大家好&#xff0c;我是…