设计模式之 模板方法模式

模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。

模板方法模式的核心在于:

  • 封装算法的骨架:通过父类中的模板方法定义算法的执行顺序和框架,保证算法结构的一致性。
  • 委派细节实现:通过抽象方法的方式,允许子类根据自己的需求来提供具体实现,增强了算法的灵活性。

一、模板方法模式的结构

模板方法模式的核心是一个“模板方法”,它通常是一个在父类中定义的具体方法,里面包含了步骤的调用,而步骤的具体实现交给子类。下面是模板方法模式的基本结构:

  1. 抽象类(Abstract Class)

    定义一个模板方法,包含了算法的框架。模板方法通常是具体的方法,它调用一些抽象方法,并通过这些抽象方法将某些步骤的实现委托给子类。
    声明一些抽象方法,这些方法将由子类具体实现,代表算法中的具体步骤。
  2. 具体类(Concrete Class)

    实现抽象类中的抽象方法,提供每个步骤的具体实现。
  3. 模板方法(Template Method)

    在抽象类中定义的具体方法,它为整个算法提供了固定的执行流程和框架。子类可以在模板方法的框架中执行其特定的步骤。

二、模板方法模式的实现

假设我们正在设计一个做菜的程序。做菜的步骤大致是固定的:起锅,热油,加菜,加调料,出锅。不同的菜肴有相同的烹饪步骤,可以通过模板方法来实现不同菜肴的流程。

  • 抽象类
    public abstract class AbstractCook {public void cookProcess(){begin();pourOil();addVegetable();addSauce();end();}public void begin(){System.out.println("起锅");}public void pourOil(){System.out.println("烧油");}public abstract void addVegetable();public abstract void addSauce();public void end(){System.out.println("出锅");}
    }
  • 具体类
    public class CookCabbage extends AbstractCook{@Overridepublic void addVegetable() {System.out.println("加白菜");}@Overridepublic void addSauce() {System.out.println("加醋,加盐");}
    }
    
    public class CookCarrot extends AbstractCook{@Overridepublic void addVegetable() {System.out.println("加胡萝卜");}@Overridepublic void addSauce() {System.out.println("加盐,加味精");}
    }
  • 客户端
    public class Client {public static void main(String[] args) {AbstractCook cook = new CookCabbage();cook.cookProcess();}
    }
    
  • 运行结果

三、模板方法模式的优缺点

优点:
  1. 代码复用:模板方法模式将算法的公共部分提取到父类中,避免了重复代码,提高了代码复用性。
  2. 灵活性:尽管算法框架是固定的,但通过子类可以实现特定步骤的变化,符合开闭原则(对扩展开放,对修改封闭)。
  3. 控制反转:模板方法模式通过父类控制了算法的结构,子类只需关注具体的实现细节,不必关心算法框架。
缺点:
  1. 过度设计:如果算法结构简单,或者算法变化较小,使用模板方法模式可能会显得过于复杂,增加了设计的复杂度。
  2. 对子类依赖:子类必须依赖父类提供的模板方法和结构,这可能导致子类与父类之间耦合较高。子类只能按照父类定义的步骤来实现,无法自由调整流程。

四、模板方法模式的应用场景

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

  1. 算法框架稳定,步骤可变

    当算法框架的结构不变,但具体的实现步骤可以变化时,模板方法模式是非常合适的选择。子类只需要实现算法中的具体步骤即可,而不需要关心框架本身的设计。
  2. 操作顺序固定,步骤可扩展

    比如游戏中的回合制战斗,或者一些具有固定执行顺序的流程,模板方法模式可以帮助固定这些步骤的顺序,并允许不同的子类根据需要改变具体的操作。
  3. 避免代码重复

    如果某个系统中有多个操作流程,且这些流程中有重复的步骤,那么模板方法模式可以有效地提取出这些共通的部分,从而减少重复代码。
  4. 框架的设计

    模板方法模式经常用于设计框架类。一个框架可以提供一个模板方法,子类在继承框架时只需实现其中的一些步骤。
现实生活中的例子:
  • 软件测试框架:在自动化测试框架中,测试步骤往往包括初始化、执行测试、清理环境等,模板方法模式可以帮助确保这些步骤的一致性,而允许子类定义具体的测试方法。
  • 文件处理:比如读取CSV文件、XML文件、JSON文件等,虽然不同的文件格式有不同的解析方法,但读取文件、解析文件和处理数据的步骤通常是相似的,模板方法模式可以用来构建一个统一的文件处理框架。

五、模板方法模式与其他设计模式的关系

模板方法模式与其他行为型设计模式有一些相似性和不同之处:

  1. 模板方法模式 vs 策略模式

    • 模板方法模式:定义了算法的骨架,允许子类实现具体的步骤,但整体算法框架不可改变。
    • 策略模式:允许算法在运行时改变,客户端可以选择不同的策略来完成任务,通常是通过组合来实现不同的策略,而不是通过继承来实现算法的变化。
  2. 模板方法模式 vs 状态模式

    • 状态模式:允许对象根据其内部状态的不同来改变其行为,状态是动态变化的。
    • 模板方法模式:则是在父类中定义一个固定的算法框架,子类仅需要实现某些步骤,而状态变化并不会影响整个算法的框架。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分治】--- 快速选择算法

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 🏠 颜色划分 📌 题目解析 颜色分类 本题要求我们原地对元数组划分0,1,2三个区域,也就是不能使用辅助数组&#xf…

万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统

万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统 哈喽小伙伴们还,我是Stark-C~ 最近苹果Mac mini 2024款在政府补贴的加持下,仅需3500块钱左右就能到手确实挺香的。我看很多评论区的小伙伴跃跃欲试,但是也有不少之前从未体…

C++设计模式行为模式———状态模式

文章目录 一、引言二、状态模式三、总结三、总结 一、引言 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。其实现可完成类似有限状态机的功能。换句话说,一个对象可以处…

vscode自动打印日志插件

自动日志工具(Auto Logger Log) 概述 自动日志工具(Auto Logger Log) 是一款 VS Code 扩展,用于简化生成调试日志的过程。它可以为选中的变量自动生成打印语句,帮助开发者快速记录和调试代码。该扩展支持多…

优雅的不等式——Hard

上一文《Easy》末尾出现了又要我们证明的例子,Hard难度就是继续答题答下去 其实一样可以用那篇文章https://zhuanlan.zhihu.com/p/669285539中的式子继续算下去,但是有三个系数,实在是太费时间和人力了 翻到下面的第十九种类型,可…

虚拟局域网PPTP配置与验证(二)

虚拟局域网PPTP配置与验证(二) windows VPN客户端linux 客户端openwrt客户端性能验证虚拟局域网PPTP配置与验证(一)虚拟局域网PPTP配置与验证(二) : 本文介绍几种客户端连接PPTP服务端的方法,同时对linux/windows/openwrt 操作系统及x86、arm硬件平台下PPTP包转发性能进…

Move 合约部署踩坑笔记:如何解决 Sui 客户端发布错误Committing lock file

Move 共学活动:快速上手 Move 开发 为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言&#…

介绍一下strupr(arr);(c基础)

hi , I am 36 适合对象c语言初学者 strupr(arr)&#xff1b;函数是把arr数组变为大写字母 格式 #include<string.h> strupr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…

进程间通信5:信号

引入 我们之前学习了信号量&#xff0c;信号量和信号可不是一个东西&#xff0c;不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的&#xff0c;无法预测信号可以临时保存下来&#xff0c;之后再处理信号是异步发送的…

浅谈网络 | 传输层之套接字Socket

目录 基于 TCP 协议的 Socket 程序调用过程基于 UDP 协议的 Socket 程序函数调用过程服务器如何接入更多的项目构建高并发服务端&#xff1a;从多进程到 IO 多路复用 在前面&#xff0c;我们已经介绍了 TCP 和 UDP 协议&#xff0c;但还没有实践过。接下来这一节&#xff0c;我…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

FileLink内外网文件共享系统与FTP对比:高效、安全的文件传输新选择

随着信息技术的不断进步&#xff0c;文件传输和共享已经成为企业日常工作中不可或缺的一部分。传统的FTP&#xff08;File Transfer Protocol&#xff09;协议在一定程度上为文件共享提供了便利&#xff0c;但随着企业对文件传输的需求越来越复杂&#xff0c;FileLink内外网文件…

神经网络归一化方法总结

在深度学习中&#xff0c;归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结&#xff0c;包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…

ORB-SLAM2源码学习:Initializer.cc:Initializer::ComputeF21地图初始化——计算基础矩阵

前言 在平面场景我们通过求解单应矩阵H来求解位姿&#xff0c;但是我们在实际中常见的都是非平面场景&#xff0c; 此时需要用基础矩阵F求解位姿。 1.函数声明 cv::Mat Initializer::ComputeF21(const vector<cv::Point2f> &vP1, const vector<cv::Point2f>…

离散化 C++

题目 解题思路 将所有对坐标的访问用map映射到一个新的坐标轴上再在新的坐标轴上进行加法用前缀和快速求出区间的和 代码实现 #include<iostream> #include<algorithm> #include<unordered_map>using namespace std;typedef pair<int, int> PII;con…

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

机器学习与图像处理中上采样与下采样

一、机器学习中的上采样 目的&#xff1a;在机器学习中&#xff0c;上采样用于处理不平衡数据集&#xff0c;即某些类别的样本数量远多于其他类别。上采样的目标是通过增加少数类样本的数量来平衡类别分布&#xff0c;从而提高模型对少数类的识别能力。 1.随机过采样&#xff0…

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

认识RabbitMq和RabbitMq的使用

1 认识RabbitMq RabbitMQ是⼀个消息中间件&#xff0c;也是⼀个生产者消费者模型&#xff0c;它负责接收&#xff0c;存储并转发消息。 2.1 Producer和Consumer Producer&#xff1a;生产者&#xff0c;是RabbitMQServer的客户端&#xff0c;向RabbitMQ发送消息 Consumer&…