设计模式(行为型模式)模板方法模式

目录

    • 一、简介
    • 二、模板方法模式
      • 2.1、抽象模板类
      • 2.2、退款申请
      • 2.3、转账申请
      • 2.4、使用
    • 三、优点与缺点

一、简介

  模板方法模式 又称 模板模式(Template Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类重写特定步骤的方法,而不改变算法的整体结构。

在模板模式中,定义了一个抽象类,该抽象类包含了算法的框架,其中的某些步骤由抽象方法或默认实现提供。具体步骤的实现延迟到子类中。这样,子类可以根据需要重写父类的方法,同时保留算法的整体结构。模板模式主要包含以下关键组件:

  • 模板(Abstract Template): 定义了算法的框架,通常是一个抽象类,其中包含了算法中的各个步骤,有些步骤可能是抽象的或有默认实现。
  • 具体实现(Concrete Implementation): 继承自模板类的具体子类,实现了在模板中定义的抽象方法,以完成算法中的特定步骤。
  • 钩子方法(Hooks): 可选的方法,可以在模板类中提供默认实现,但子类可以选择性地覆盖它们来实现特定行为。

  模板模式使得整体算法的结构固定,但其中的某些步骤可以由子类进行定制,从而避免了代码重复和增加灵活性,使得代码更易于维护和扩展。

二、模板方法模式

2.1、抽象模板类

import java.util.Map;public abstract class BusinessProcessTemplate {public final Map<String, String> process(Map<String, String> paramsMap) {// 检查参数Map<String, String> validateResult = validate(paramsMap);String code = validateResult.getOrDefault("code", "0000");System.out.println("校验参数返回:"+validateResult);if (!"0000".equals(code)) {return validateResult;}// 执行业务Map<String, String> resultMap = execute(paramsMap);System.out.println("业务处理返回结果:"+resultMap);// 省略其他操作及其异常处理// 返回结果return resultMap;}public abstract Map<String, String> validate(Map<String, String> paramsMap);public abstract Map<String, String> execute(Map<String, String> paramsMap);}

2.2、退款申请

import java.util.HashMap;
import java.util.Map;public class RefundApplyService extends BusinessProcessTemplate {@Overridepublic Map<String, String> validate(Map<String, String> paramsMap) {System.out.println("-------------------------退款申请---------------------");System.out.println("退款申请参数:" + paramsMap);Map<String, String> validateResult = new HashMap<>();validateResult.put("code", "1000");int amount = Integer.parseInt(paramsMap.getOrDefault("amount", "0"));if (amount <= 0) {validateResult.put("msg", "退款金额必须大于0元");return validateResult;}// 其他参数校验等...validateResult.put("code", "0000");validateResult.put("msg", "参数验证通过");return validateResult;}@Overridepublic Map<String, String> execute(Map<String, String> paramsMap) {Map<String, String> resultMap = new HashMap<>();// 执行业务判断// 退款申请等resultMap.put("code", "0000");resultMap.put("msg", "success");return resultMap;}
}

2.3、转账申请

import org.apache.commons.lang3.StringUtils;import java.util.HashMap;
import java.util.Map;public class TransferApplyService extends BusinessProcessTemplate{@Overridepublic Map<String, String> validate(Map<String, String> paramsMap) {System.out.println("------------------------转账申请----------------------");System.out.println("转账申请参数:"+paramsMap);Map<String, String> validateResult = new HashMap<>();validateResult.put("code", "1000");String account = paramsMap.getOrDefault("account", "0");int amount = Integer.parseInt(paramsMap.getOrDefault("amount", "0"));if (StringUtils.isNotBlank(account)) {validateResult.put("msg", "账户不能为空");return validateResult;}if (amount <= 0 || amount>200) {validateResult.put("msg", "转账金额必须大于0元,小于等于200元");return validateResult;}// 其他参数校验等...validateResult.put("code", "0000");validateResult.put("msg", "参数验证通过");return validateResult;}@Overridepublic Map<String, String> execute(Map<String, String> paramsMap) {Map<String, String> resultMap = new HashMap<>();// 执行业务判断// 转账申请等resultMap.put("code", "0000");resultMap.put("msg", "success");return resultMap;}
}

2.4、使用

import java.util.HashMap;
import java.util.Map;public class TemplatePatternExample {public static void main(String[] args) {// 退款申请Map<String, String> refundParamsMap = new HashMap<>();refundParamsMap.put("amount", "100");BusinessProcessTemplate refundProcess = new RefundApplyService();refundProcess.process(refundParamsMap);// 转账申请Map<String, String> transferParamsMap = new HashMap<>();transferParamsMap.put("amount", "300");BusinessProcessTemplate transferProcess = new TransferApplyService();transferProcess.process(transferParamsMap);}
}

三、优点与缺点

  模板方法模式(Template Method Pattern)的优点和缺点如下所示:

优点

  • 代码复用: 将相同的代码抽取到父类的模板方法中,实现代码复用,避免了重复编码。
  • 提高扩展性: 允许子类重写父类的特定步骤,提高了系统的灵活性和可扩展性。
  • 符合开闭原则: 模板方法模式使得父类的模板方法结构不变,子类可以在不改变整体结构的情况下修改特定步骤的实现,符合开闭原则。
  • 封装不变部分: 将算法的不变部分封装到父类中,便于管理和维护。

缺点

  • 父类对子类的依赖: 子类必须遵循父类的约定来实现特定的步骤,限制了子类的灵活性。
  • 增加了类的数量: 对每个需要定制的算法步骤都需要一个子类,可能会导致类的数量增加。
  • 不适用于所有场景: 如果算法的整体结构经常变化,或者每个子类的差异性较大,模板方法可能不适用。

  总的来说,模板方法模式能够提高代码的复用性、提高系统的扩展性和可维护性,但需要注意子类的依赖性和不适用于所有的场景。选择使用模板方法模式时,需要根据具体的情况来评估其优缺点,以确保模式的适用性。

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

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

相关文章

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后&#xff0c;次序不变&#xff0c;则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

【C++ QT项目2】——高仿安信可串口调试助手

【C QT项目2】——高仿安信可串口调试助手 1. 项目概述2. 项目UI设计3. 串口通信核心代码开发3.1 QSerialPort介绍及示例3.2 扫描系统串口3.3 数据的收发3.4 定时发送&#xff08;QT定时器&#xff09;3.5 HEX显示与发送 4. 串口调试助手功能的优化4.1 串口的实时扫描4.2 获取系…

Backtrader 文档学习- 整体架构功能分析理解

Backtrader 文档学习- 架构功能分析理解 1. 概述 backtrader是一个用于开发和执行交易策略的Python框架。它提供了一套完整的工具和功能&#xff0c;使得用户可以方便地进行策略回测、实盘交易以及数据分析。 backtrader的入口为Cerebro类&#xff0c;该类将所有输入(Data F…

Linux中获取字符串长度与获取子字符串

一、 获取字符串长度 #!/bin/bash string"jobs" echo ${string} # 输出结果: jobs echo ${#string} # 输出结果: 4 二、提取子字符串 以下实例从字符串第 2 个字符开始截取 4 个字符&#xff1a; #!/bin/bash str"敢于亮剑决不后退" echo ${str:2:…

PCB的介质损耗角是什么“∠”?

1、什么叫介质 介质是指在某种特定条件下能够传递力、能量或信息的物质或者空间。在物理学和工程学中&#xff0c;介质通常是指固体、液体或气体&#xff0c;它们能够传递机械波、电磁波等。例如&#xff0c;在声学中&#xff0c;空气、水和固体都可以作为声波的传播介质&…

宠物空气净化器哪个品牌高质量?宠物空气净化器适合养猫家庭吗?

在养宠物的家庭中&#xff0c;除了必备的猫粮、猫砂和罐头等日常用品&#xff0c;宠物空气净化器也是不可或缺的。这种设备可以在我们无法开窗通风的情况下&#xff0c;有效净化室内空气&#xff0c;同时降低因动物皮屑引起的过敏反应。然而&#xff0c;在市场上充斥着各种功能…

STM32--EXTI外部中断

一、中断概念 二、EXTI简介 相同的Pin不能同时触发中断&#xff1a;比如PA0和PB0不能同时使用&#xff1b; 三、STM32中断 中断向量表&#xff1a; 程序中中断函数的地址是由编译器来分配的&#xff0c;是不固定的。但中断的跳转&#xff0c;由于硬件的限制&#xff0c;只能跳…

HTML+CSS+JS:焦点轮播

效果演示 实现了一个简单的图片展示和交互效果&#xff0c;用户可以点击不同的图片进行查看&#xff0c;并且会有视觉反馈。 Code <div class"container"><div class"bigbox"></div><div class"list"><ul><li…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的&#xff0c;可以使用一个链表数据结构来表示&#xff0c;其中每一个结点就是一个对象。 一般地&#xff0c;除了key和位置…

Matlab论文插图绘制模板第136期—极坐标气泡图

在之前的文章中&#xff0c;分享了Matlab笛卡尔坐标系的气泡图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下极坐标气泡图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋…

微前端(qiankun)vue3+vite

目录 一、什么是微前端 二、主应用接入 qiankun 1.按照qiankun插件 2.注册微应用引用 3.挂载容器 三、微应用接入 qiankun 1.vite.config.ts 2.main.ts ps&#xff1a;手动加载微应用方式 ps&#xff1a;为什么不用 iframe 一、什么是微前端 微前端是一种多个团队通过独…

四、详解Redis集群

一、RDB和AOF持久化 redis的数据一般保存在内存&#xff0c;那么当突然宕机&#xff0c;岂不是数据就丢失了&#xff0c;因此redis实现了将数据持久化的方式&#xff1a;RDB和AOF两种持久化方式。 1.1 RDB持久化&#xff08;bgsave&#xff09; redis支持快照的方式进行数据…

【激光SLAM】激光的前端配准算法

文章目录 ICP匹配方法&#xff08;Point to Point&#xff09;PL-ICP匹配方法&#xff08;Point to Line&#xff09;基于优化的匹配方法&#xff08;Optimization-based Method&#xff09;优化方法的求解地图双线性插值拉格朗日插值法——一维线性插值 相关方法&#xff08;C…

微信小程序按需注入和用时注入

官网链接 按需注入 {"lazyCodeLoading": "requiredComponents" }注意事项 启用按需注入后&#xff0c;小程序仅注入当前访问页面所需的自定义组件和页面代码。未访问的页面、当前页面未声明的自定义组件不会被加载和初始化&#xff0c;对应代码文件将不…

【HarmonyOS】鸿蒙开发之Text组件——第3.2章

text组件属性介绍 textAlign有三种属性start(默认),end,center Column(){//默认文字大小16Text("迪加奥特曼").width(200)Text().margin({top:10,bottom:10})Text("泰罗奥特曼").width(200).fontSize(26).fontColor(Color.Red).textAlign(TextAlign.End)…

H12-821_130

130.如图所示&#xff0c;R1与R2组成一个VRRP备份组1&#xff0c;通过在R1执行vrrp vrid 1 virtual-ip_______命令&#xff0c;可以使其成为IP地址拥有者&#xff0c;让R1为Master, R2为Backup 。 答案&#xff1a;192.168.1.254 注释&#xff1a; IP地址拥有者优先级是255&am…

uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)

方案&#xff1a;使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意&#xff1a;u-parse直接使用是不兼容小程序的&#xff0c;需要对u-parse进行改造&#xff1a; 1. 查看u-parse源码发现小程序走到以…

程序员金三银四跳槽指南:时间线经典面试16问

祝大家成功上岸&#xff0c;升职加薪&#xff0c;冲鸭 &#x1f389; 金三银四 今天复工&#xff0c;就要开始准备啦&#x1f4bc;✨ 把握好打工人跳槽的金三银四&#xff0c;获得满意的新工作 &#x1f389; 时间线 年后跳槽时间线&#xff0c;过完年刚好开始准备&#xf…

无人机技术,无人机动力系统知识,电机、电调、桨叶技术详解

无人机动力系统中的电机、电调和桨叶技术都是非常重要的部分&#xff0c;以下是对这些技术的详解&#xff1a; 无人机电机 在无人机动力系统中&#xff0c;电机是将电能转化为机械能的关键部件。其主要作用是产生旋转力矩&#xff0c;驱动螺旋桨的旋转&#xff0c;从而实现无…

LeetCode--2298. 周末任务计数

文章目录 1 题目描述2 测试用例3 解题思路 1 题目描述 表: Tasks ------------------- | Column Name | Type | ------------------- | task_id | int | | assignee_id | int | | submit_date | date | -------------------task_id 是该表的主键&#xff08;具有唯一值…