「聊设计模式」之模板方法模式(Template Method)

news2024/9/30 11:36:00

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  在软件开发中,设计模式是经典的解决方案,它们被广泛应用于面向对象的程序设计中。其中,模板方法模式(Template Method)是一种常用的行为型设计模式,它定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。本文将从原理、实现以及应用场景三个方面来介绍模板方法模式。

摘要

  模板方法模式是一种基于继承的设计模式,它通过抽象父类定义一系列的抽象方法和模板方法,而由具体的子类来实现这些抽象方法,从而完成对算法的具体实现。模板方法模式遵循“开闭原则”,能够很好地解决代码复用、扩展性和屏蔽细节等问题。

模板方法模式

模式概念

  模板方法模式是一种行为型设计模式,它定义一个算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。它通过将相同的代码抽象到父类中来避免代码重复和复杂性,而通过子类的扩展来实现算法的不同变化。模板方法模式是一种可扩展性很强的模式,因为它使用了多态性和继承来实现不同的算法变化。模板方法模式在软件开发中广泛应用于框架开发、算法设计和复杂业务逻辑的实现。

模式结构

模板方法模式的结构包括以下几个角色:

  1. 抽象类(Abstract Class):定义了一系列抽象方法和模板方法。其中模板方法定义了算法的骨架,而抽象方法则需要子类去实现。

  2. 具体类(Concrete Class):实现了抽象类中定义的抽象方法,完成算法中具体的步骤。同时,它还可以重写模板方法中的某些步骤,来实现算法的变化。

通过这种方式,模板方法模式将算法的具体实现推迟到具体子类中,从而实现了算法的复用和扩展。

如下是模板方法模式的UML类图:

在这里插入图片描述

模式优缺点

优点

1.模板方法模式提供了一种代码复用的方式,将实现相同或类似的方法抽象到父类中,减少了代码的重复性。
2.模板方法模式提供了一种易于维护的方式,由于具体实现都在父类中,所以在需要修改时只需要在父类中修改即可,不需要修改每个子类。
3.模板方法模式提高了代码的灵活性,通过抽象出一些方法,可以方便地扩展子类功能。

缺点

1.在父类中定义了抽象方法,要求子类实现,如果父类的AbstractClass在设计时不够完善,或者需要修改时,会对所有的子类造成影响。
2.模板方法模式降低了程序的灵活性,当父类增加新的抽象方法时,所有子类都必须进行修改,否则编译会出错。

应用场景

模板方法模式适用于以下场景:

  • 在多个类中存在相似的算法,但具体实现不同的情况下,可以使用模板方法模式将算法的公共部分抽象出来,由子类实现不同的具体实现。
  • 当需要控制子类的扩展时,可以使用模板方法模式。模板方法模式通过定义抽象类来规范子类的方法实现,子类必须遵从抽象类中定义的方法的规范,这样可以控制子类的扩展。
  • 如果需要一次性编写出框架的核心代码,而将具体实现留给子类来实现,可以使用模板方法模式。

模式代码实现

  下面通过一个简单的示例来说明模板方法模式的实现。

  假设我们需要开发一个系统,实现计算机基准测试的功能。我们可以定义一个Benchmark类来表示基准测试,其中包括start()run()stop()三个抽象方法,分别用于启动测试、执行测试和结束测试。具体的测试算法可以由子类来实现。

package com.example.javaDesignPattern.templateMethod;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/20 15:44
 */
public abstract class Benchmark {
    public void runBenchmark() {
        start();
        for (int i = 0; i < 10; i++) {
            run();
        }
        stop();
    }

    public abstract void start();

    public abstract void run();

    public abstract void stop();
}

我们可以定义一个具体的子类来实现具体的测试算法,如下所示:

package com.example.javaDesignPattern.templateMethod;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/20 15:44
 */
public class ConcreteBenchmark extends Benchmark {
    @Override
    public void start() {
        System.out.println("启动基准测试");
    }

    @Override
    public void run() {
        System.out.println("执行基准测试");
    }

    @Override
    public void stop() {
        System.out.println("结束基准测试");
    }
}

  其中定义了一个基准测试的抽象类Benchmark,其中包含了一个模板方法,模板方法定义了基本操作的顺序和流程,具体的操作由子类实现。

  具体的子类ConcreteBenchmark重写了三个抽象方法startrunstop,其中start方法启动了基准测试,run方法执行了基准测试,stop方法结束了基准测试。

  在具体的子类中,可以实现具体的基准测试,而模板方法中定义的流程保证了基准测试的正确性和可维护性。这种设计模式可以减少代码重复,提高代码的可读性和可维护性。

  然后你在使用时,我们可以先创建一个Benchmark对象,然后调用它的runBenchmark()方法,即可执行具体的测试算法。

package com.example.javaDesignPattern.templateMethod;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/9/20 15:45
 */
public class Client {
    public static void main(String[] args) {
        Benchmark benchmark = new ConcreteBenchmark();
        benchmark.runBenchmark();
    }
}

执行结果如下:

在这里插入图片描述

代码解读:

  如上代码,定义了一个名为Client的类,其中包含一个名为main的公共静态方法。当程序运行时,将创建一个ConcreteBenchmark对象,该对象实现了Benchmark接口,并将其赋值给类型为Benchmarkbenchmark变量。接下来,runBenchmark方法将被调用来执行基准测试。

附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

总结

  模板方法模式是一种基于继承的设计模式,它通过一系列抽象方法和模板方法来定义算法骨架,而由具体的子类来实现这些抽象方法,从而完成对算法的具体实现。模板方法模式可以很好地解决代码复用、扩展性和屏蔽细节等问题。在实际应用中,模板方法模式比较常用,比如在框架设计、算法设计等方面都有广泛的应用。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

广州某机械制造企业生产工序管理系统解决方案

RFID工序管理解决方案在生产工序中引入RFID技术&#xff0c;对生产工序的构件拼装、焊接、打磨后检测、打砂油漆后检测、构件拟装读取确认、项目管理人员收货确认等各个生产环节的数据进行自动化的数据采集&#xff0c;保证生产管理各个作业环节数据输入的效率和准确性&#xf…

如何防止数据库泄露,保障个人信息安全题

在数字化时代&#xff0c;个人信息安全和数据库安全至关重要。为了防止数据库泄露&#xff0c;保障个人信息安全&#xff0c;以下安策带来的一些建议&#xff1a; 1.强化密码管理 密码是保护个人信息安全的第一道防线。确保使用复杂且独特的密码&#xff0c;避免使用容易猜测或…

二分与前缀和

目录 &#x1f348;前言 ❤二分 &#x1f339;二分 &#x1f33c;数的范围 &#x1f33c;数的三次方根 &#x1f33c;特殊数字 &#x1f33c;机器人跳跃问题 &#x1f33c;四平方和 &#x1f33c;分巧克力 &#x1f339;前缀和 &#x1f33c;前缀和 &#x1f33c;子…

html form表单高级用法

场景&#xff1a;想单纯使用表单内置的api完成提交&#xff0c;不使用js代码 代码如下&#xff1a; <form name"myForm" action"http://localhost:13734/form" method"post"><label>用户名<input type"text" name&qu…

SecureCRT SSH与FTP连接中文乱码

1、首先要保证服务端环境变量是UTF-8编码的 LANG”zh_CN.UTF-8″ 2、会话里面配置好字符编码&#xff1a;UTF-8 SSH会话的窗口就可以正常显示中文了&#xff0c;效果如下 3、打开FTP或者SFTP时进行文件传输时&#xff0c;列表窗口里面还是乱码&#xff0c;需要把SecureCRT安…

BENTLY 350015 127610-01数字量输入模块

数字输入功能&#xff1a; BENTLY 350015 127610-01模块通常用于监测和采集数字输入信号&#xff0c;例如开关状态、传感器状态等。 多通道&#xff1a; 这些模块通常具有多个输入通道&#xff0c;允许同时监测多个数字输入信号。 高精度&#xff1a; BENTLY 350015 127610-0…

四维轻云平台倾斜模型三种加载方式及单体化操作介绍

为了优化倾斜模型浏览效果&#xff0c;「四维轻云」v1.4.1针对倾斜模型新增了三种加载方式&#xff1b;此外&#xff0c;平台还增加了单体化等功能。但很多用户还不会使用这些功能&#xff0c;小编就来向大家介绍一些如何设置倾斜模型的三种加载方式和单体化操作。 一、倾斜模…

爬虫技术对携程网旅游景点和酒店信息的数据挖掘和分析应用

导语 爬虫技术是一种通过网络爬取目标网站的数据并进行分析的技术&#xff0c;它可以用于各种领域&#xff0c;如电子商务、社交媒体、新闻、教育等。本文将介绍如何使用爬虫技术对携程网旅游景点和酒店信息进行数据挖掘和分析&#xff0c;以及如何利用Selenium库和代理IP技术…

如何连接到远程桌面

远程桌面连接是一个非常有用的工具&#xff0c;尤其是当越来越多的人在家工作或使用自己的设备工作时。使用远程桌面连接软件&#xff0c;管理员即使不在您的设备附近&#xff0c;也可以解决问题&#xff0c;他们可以远程访问它并快速解决可能出现的任何问题。 什么是远程桌面…

初探微前端

微前端 一、微前端的背景和概述1.1 概念1.2 特点1.3 背景 二、微前端的实现方式2.1 服务端集成2.2 运行时集成 三、现有的解决方案3.1 single-spa3.2 qiankun3.3 micro-app 四、总结 &#x1f680;&#x1f680;&#x1f680;   随着互联网技术的不断发展&#xff0c;前端应用…

如何构建高效的接口自动化测试框架(文档+视频讲解)

在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选择哪种框架&#xff0c;重要的是确保 框架功能完备&#xff0c;易于维护和扩展&#xff0c;提高测试效率和准确性。今…

最新版小说泛站群系统源码 小说泛目录站群源码系统程序/PHP语言(源码+教程)

源码简介&#xff1a; 新版小说泛目录站群系统网站源码&#xff08;小说站群源码&#xff09;&#xff0c;PHP小说泛站群系统程序&#xff0c;网站优化泛目录站群源码&#xff0c;新版小说泛站群系统源码&#xff0c;小说站群源码&#xff0c;小说泛目录站群源码PHP语言操作简…

《合成孔径雷达成像算法与实现》Figure5.4

clc clear close all%% 参数设置 Ta 128; % 脉冲持续时间 Ka -0.085; % 方位向调频率 alpha_OS [5,0.25]; …

《Python趣味工具》——自制emoji(4)计算机二级考试题

前面我们学习了如何制作emoji&#xff0c;相信你也是有很多想法了吧&#xff01;今天我们就来看看几道计算机二级考试真题。 1. 绘制套圈 使用turtle库的circle()函数和seth()函数绘制套圈。 最小的圆圈半径为10像素&#xff0c;不同圆圈之间的半径差是40像素。 ps:注意要和题…

【生物信息学】奇异值分解(SVD)

目录 一、奇异值分解&#xff08;SVD&#xff09; 二、Python实现 1. 调包np.linalg.svd() 2. 自定义 三、SVD实现链路预测 一、奇异值分解&#xff08;SVD&#xff09; SVD分解核心思想是通过降低矩阵的秩来提取出最重要的信息&#xff0c;实现数据的降维和去噪。 ChatG…

针对敏感数据的安全转录服务

即便在新冠肺炎疫情期间&#xff0c;继续保持了最高级别的机密性 新冠肺炎疫情带来的各种限制向所有服务提供商提出了挑战&#xff0c;促使提供商们想方设法采取更富想象力的新方法来满足客户的需求。澳鹏采用了一种由两种方案组成的工作机制&#xff0c;服务于客户机密材料的…

systrace使用注意事项

打开systrace文件报错&#xff1a;Unable to select a master clock domain because no path can be found from “SYSTRACE” to “LINUX_FTRACE_GLOBAL”. 使用systrace生成的trace.html文件无法打开&#xff0c;或者报上面的错误&#xff0c;可以选择下面这个方式&#xff1…

Springboot 实践(19)负载平衡配置与运用

前文Springboot 实践&#xff08;1&#xff09;至Springboot 实践&#xff08;18&#xff09;&#xff0c;我们分别讲解了springboot数据源配置、swagger-ui测试controller、整合security、整合Oauth2.0、服务注册、路由配置以及配置中心等单例功能开发&#xff0c;实现了各个系…

Avalonia开发(一)环境搭建

一、介绍 开源 GitHub&#xff1a;https://github.com/AvaloniaUI/Avalonia/多平台支持&#xff0c;包括Windows、mac OS、Linux、iOS、Android、Samsung Tizen&#xff08;很快支持&#xff09;、WebAssemblyIDE支持&#xff0c;Visual Studio扩展支持&#xff0c;JetBrains …

NLP技术如何为搜索引擎赋能

目录 1. NLP关键词提取与匹配在搜索引擎中的应用1. 关键词提取例子 2. 关键词匹配例子 Python实现 2. NLP语义搜索在搜索引擎中的应用1. 语义搜索的定义例子 2. 语义搜索的重要性例子 Python/PyTorch实现 3. NLP个性化搜索建议在搜索引擎中的应用1. 个性化搜索建议的定义例子 2…