第二十一章 模板方法(Template Method)

C++设计模式_03_模板方法Template Method 定义一个操作中的算法的骨架(对应第二种方法的run函数) (稳定),而将一些步骤延迟(延迟一般代表定义一个虚函数,让子类去实现虚函数,也就是支持子类来变化)(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构,即可重定义(override 重写)该算法的某些特定步骤。—《设计模式》GoF可以参考方法二中的代码进行映射理解的。 阅读详情

第二十一章 模板方法(Template Method)

什么是模板方法呢?我们先回想以下SQL保存的例子,这个例子要求我们能够同时处理三种类型的SQL语句保存文件:XML格式的文件,Properties格式文件和普通的文本格式的文件。不论那种格式的文件都要求能够提供根据SQL语句名字获得SQL语句的方法。我们可以这样子设计:

public class AbstractSqlManager {

     private Map sqlMap ;

     public AbstractSqlManager(String filePath) {

         sqlMap = initSqlMap(filePath)

     }

     

     public String getSql(String key) {

         return (String)sqlMap.get(key);

     } 

     

     public abstract Map initSqlMap(String filePath);

} 

 

public class XmlSqlManager extends AbstractSqlMamager {

     public Map initSqlMap(String filePath) {

         // 解析XML文件将SQL语句,以SQL语句的名字为Key,放在sqlMap中。

      }

}

 

public class PropertiesSqlManager extends AbstractSqlMamager {

     public Map initSqlMap(String filePath) {

         // 解析Properties文件将SQL语句,以SQL语句的名字为Key,放在sqlMap中。

      }

}

public class TextSqlManager extends AbstractSqlMamager {

     public Map initSqlMap(String filePath) {

         // 解析Text文件将SQL语句,以SQL语句的名字为Key,放在sqlMap中。

      }

}

 

参看上述的代码,在AbstractSqlManager中,因为可能处理的文件的内容不同,所以将解析不同代码的方法实现放在了具体的类(XmlSqlManager ,PropertiesSqlManager 和TextSqlManager )中,只在AbstractSqlManager中实现了getSql方法。

 

我们在来考虑三个具体的实现类,在这些类实现的时候,需要从AbstractSqlManager集成,所以必须实现initSqlMap这个方法,并且必须按照AbstractSqlManager中定义的格式(模板)来实现。

 

这样可以称initSqlMap为模板方法,也可以称上述的设计为模板方法。

 

模板方法设计的好处有那些呢?

第一,也是继承的好处,可以重用代码

     如上述的例子,使用了模板方法之后,可以将公共的方法和流程在基类中编写,这样可以重用这些代码。(关于继承和组合重用代码的问题参看另外的相关讨论)

第二,可以灵活的对应变更

     因为使用了模板方法,所以相同的操作可以在基类中完成,具体的不同实现可以在具体类中完成。所以首先有了变更修改的范围很容易确定,如果是通用的操作则需要在基类中完成,例如initSqlMap之前需要使用日志记录文件的信息。如果是特殊的操作则需要在具体类中完成,例如XML文件格式发生了变更。

     

第三,规范处理流程(例如有三个模板方法)

     使用模板方法可以规范处理流程,例如要对输入的数进行相关的操作,我们可以定义这样的几个过程,(1)数据格式校验(2)数据逻辑校验(3)预处理(4)处理(5)处理输出值(6)结束

     我们可以定义这样子一个基类,包含需要的模板方法:

public class BaseTarget{

     public void execute(InputVO vo) throw ExecuteException {

         try {

                 formatCheck(vo);

                 logicCheck(vo);

                 preProcess(vo);

                 OutputVO out = process(vo);

                 formatCheck(out);

 

         } catch(FormatException ex) {

             // 异常处理

         } catch(LogicException ex) {

             // 异常处理 

         } catch(PreProcessExceptionex) {

              // 异常处理

         } catch(ProcessExceptionex) {

              // 异常处理

         } catch(PostProcessExceptionex) {

              // 异常处理

         } 

     }

 

     public abstract void formatCheck(InputVO vo) throw FormatException ;

 

     public abstract void logicCheck(InputVO vo) throw LogicException ;

 

     public abstract void preProcess(InputVO vo) throw PreProcessException;

 

     public abstract OutputVO process(InputVO vo) throw ProcessException;

 

     public abstract void postProcess(OutputVO vo) throw PostProcessException;

}

 

通过上述基类的定义,我们规定了子类型的处理内容(五个需要实现的抽象方法)和处理的顺序(按照execute方法定义的处理顺序执行)。

 

 

 
【机器人】机械臂控制入门技术栈分享 机械臂控制入门技术栈分享1.前言2.机器人控制入门技术栈2.1.空间描述和变化2.2.运动学分析2.3.动力学建模2.4.控制入门学习3.进阶部分3.1.机器人参数辨识3.2.非线性控制3.3.现代机器人描述方法:指数坐标4.总结 1.前言 今天看到优快云上有个分享个人技术栈的活动,虽然我不是一个正规的程序员,也不搞前端、后端这些,但我一直在优快云上通过写博客对我的学习进行总结,于是我突发奇想,不如我也写一下我的个人技术栈,针对机械臂控制入门的,因为我水平也不高,所以本文内容也许不够饱满,也不够准确,但 阅读详情

相关推荐

吉林大学2016级唐班c语言期末考试B卷

` #include<stdio.h> #include<stdlib.h> //双指针法,每次从a,b中选一个最大的数,从后向前一次放在数组a中 int merge(int *a,int m,int *b,int n){ int i=m-1,j=n-1,k=m+n-1; while(i>=0&&j>=0){ if(a[i]>b[j])a[...

weixin_42339173的博客 1195

Freemarker与Spring设置自定义函数

以前经常用freemarker,但是从来没有系统的学习过,最近有时间了,找到资料学习一下,官方文档下载地址:打开下载 freemarker会用并不难,本篇博客是分享freemarker和spring如何结合使用,代码全部是参考上家公司的经理的,前人栽树后人乘凉 以下两种方法,都是假设已经与springmvc整合完毕 自定义函数(普通) 1:实现TemplateMe

fengyong7723131的专栏 8223

GNSS/INS松组合导航实战:如何用卡尔曼滤波提升定位精度(附MATLAB代码)

本文深入探讨了GNSS/INS松组合导航的工程实践,详细阐述了如何利用卡尔曼滤波算法融合卫星与惯性数据以提升定位精度。内容涵盖从仿真环境搭建、误差状态卡尔曼滤波器(ESKF)设计,到状态与观测方程实现、噪声参数调试及常见问题排查的全过程,并提供了可直接运行的MATLAB代码,为开发高精度、鲁棒的组合导航系统提供实战指南。

weixin_29057163的博客 162

爬虫福利一 之 27报网MM

《爬虫福利二》点击:https://blog.youkuaiyun.com/PY0312 刚学爬虫花了4个小时写的,每一步备注的都很清楚,喜欢的朋友自己可以研究研究...... 目标网站:https://www.27bao.com 环境:Python3.x 相关第三方模块:requests、lxml Re:各位在测试时只需要打开终端,使用 python xxx.py 运行即可。 源码如下...

Nick.Peng's Blogs 82万+

【AAAI2025】【小目标检测】FBRT-YOLO:更快速、更优的实时航拍图像检测方法

FBRT-YOLO是一种新型实时航拍图像检测方法,针对小目标检测的精度与效率平衡问题提出创新解决方案。该方法通过两个轻量级模块显著提升性能:特征互补映射模块(FCM)将浅层空间位置信息深度整合至网络深层,缓解信息失衡;多核感知单元(MKP)采用多尺度卷积增强多目标感知能力。实验表明,在VisDrone、UAVDT和AI-TOD数据集上,FBRT-YOLO在检测精度和速度方面均优于现有实时检测器,特别适用于资源受限的飞行设备。该模型通过精简网络结构,在保持高性能的同时降低了计算负担,为航拍实时检测提供了高效解

weixin_44184852的博客 2900

基于Simulink的防空导弹六自由度弹道建模与仿真实战

本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。

apple5的专栏 866

塔多漫画Python爬虫—妈妈再也不用担心我看漫画了

function base64decode(str) {var base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

kerwenfly的博客 2万+

机器视觉避坑指南:为什么你的Halcon划痕检测总漏检?(附优化方案)

本文深入剖析了Halcon在表面划痕检测中漏检率高的常见原因,如灰度值波动、噪声干扰及形态学参数设置不当。针对复杂背景与低对比度划痕,提出了超越官方例程的多尺度纹理分析与特征融合优化方案,旨在帮助开发者构建更鲁棒、稳定的机器视觉检测流程,有效提升检出率。

weixin_29057163的博客 234

漫画解释----进程与线程

清晰明了 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

DuTianTian_csdn的博客 508

05 Transformer 到底解决了什么问题

Transformer 是现代大语言模型的底层骨架。本文不推公式,而是从 CNN、RNN/LSTM 的瓶颈讲起,解释 Transformer 如何通过自注意力同时解决长距离依赖和并行训练问题,并说明它为什么能支撑 GPT、BERT 和现代大模型的规模化。

老于的笔记的专栏 245

C语言实现惯导更新算法(机械编排)

四元数可用于描述刚体转动或姿态变换,与方向余弦阵相比,表达简洁。四元数是一个包含四个元素的列向量,列向量的第一个元素表示刚体围绕旋转轴转过的角度大小,其余3个元素代表了旋转轴的方向。

十八与她的博客 1730

freemarker自定义方法(六)

如果还没有基础的可以去我的博客找之前的教程学习先,我这里的所有代码都是基于freemarker+springmvc开发的。 1.前言 由于freemarder是Java代码实现的,所有我们自定义方法的时候只需要实现freemarker.template.TemplateMethodModel接口即可。这个接口中使用有个exec(java.util.List arguemnts)方法,我们调

一叶知春秋 5280

Open3D 使用RANSAC分割平面【2026最新版】

使用RANSAC从点云中分割平面,用segement_plane函数。博客长期更新,本文最新更新时间为:2026年2月28日。

点云侠的博客 37万+

C# 设计模式:第二十一章 - 行为型模式 之 模板方法模式(Template Method Pattern)

模板方法模式是一种行为型设计模式,它允许你定义一个算法的框架,而将某些步骤的具体实现留给子类来完成。模板方法模式的核心思想是通过抽象类定义一个算法的骨架,其中包含若干个抽象方法或具体方法。抽象方法由子类实现,而具体方法则是通用的,可以在所有子类中共享。通过这种方式,你可以确保算法的整体结构保持一致,同时允许子类根据需要自定义某些步骤。在这章中,我们学习了模板方法模式的基本概念、应用场景、实现方法以及注意事项。模板方法模式允许你定义一个算法的框架,而将某些步骤的具体实现留给子类来完成。游戏开发。

caifox的博客 1022

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

模板方法(Template Method)模式

模板方法(Template Method)模式 ​ 定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 抽象父类负责定义操作中的业务骨架,而把某些具体的实现步骤延迟到子类中去实现。 1. 模板的结构 1.1. 抽象类/抽象模板(Abstract Class) 1)抽象模板类 负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。 ① 模板方法:定义了算法的骨架,

weixin_42759582的博客 5082

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

设计模式详解(十一):模板方法——Template Method

Template Method 模式是一种将算法的步骤结构固定下来的设计模式,通过一个模板方法(Template Method)定义算法的执行顺序,同时将部分步骤的实现延迟到子类中去完成。通俗来说,就是定义一个通用的流程框架,并允许子类根据需要填充其中的具体步骤。

Android Engineer. 1425

模板方法(Template Method)

设计模式系列 Template Method 模板模式——对象行为模式 1.意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.适用性 模板方法应用于下列情况: 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 各子类中公共的行为应被提取出来并集中到一个公共父...

行走 1429

c++template method模板方法

模板方法一般在类库里面比较常见,类库里把实现某一功能需要的各个步骤逻辑实现好,调用者只需要按照需要重新修改某几步。框架是相对稳定的,变化隔离在客户程序。 例如实现某一功能逻辑如下 step1() step2() if (step()3) setp4() setp5() step2和step4不同用户有不同实现,其他步骤固定 将上述逻辑用模板方法实现 template_method_lib.h #i...

pynash123的博客 478

模板方法(Template Method) Java实现

模板方法模式 模板方法(Template Method)的定义 模板方法是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。 模板方法模式的结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。...

CmdSmith的博客 1051

模板方法模式-Template Method Pattern

目录 模式的定义与特点 模式的结构与实现 模式的应用实例 模式的应用场景 模式的扩展 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队...

心猿意碼 3886

设计模式:C++ 模板方法模式 (Template Method in C++)

设计模式:C++ 模板方法模式 (Template Method in C++)

程永强 1270

模板方法模式Template method(类行为型)

今天重读了 模板方法 模式,温故而知新 了。 她是基于继承的代码复用的基本技术,她的结构和用法也是面向对象设计的核心。 java方面应用:selvert中就用到了。   命名规范:钩子方法的名字应以do开头。   大家自己去看资料会理解深些。 有问题可以在这里提问。   设计模式的有趣见解 :   TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认

it_man的专栏 1722

Template Method——模板方法模式

Template Method——模板方法模式 什么是模板方法模式 ​ 在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为模板方法模式,模板方法通过把不变的行为移到父类,去除子类中的重复代码,提高代码复用率。 ​ 如果要完成在某***一些细节层次一致的一个过程或一系列步骤,旦其个别步骤在更详细的层次上的实现可能不同***时,可以考虑用模板方法模式。 模板方法模式中的角色构成 模板方法模式类图 AbstractClass (抽象类) ​ AbstractClass角色负责实现模板方法以及声

qq_36491103的博客 248
上一篇: 关于Struts2的一些实例代码
下一篇: 第二十二章Singleton和对象创建
struts2
博客等级 码龄19年 885粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值