设计模式之“模板方法模式(TemplateMethod)”
一、使用场景
场景1
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理
例如:将子类重复声明的方法提到父类去声明,利用多态性,实现了代码的复用(子类重写)

场景2
遇到由一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的,但有些步骤的实现可能不通,这时候,我们通常就可以考虑使用模板方法模式了
二、定义
模板方法模式:定义一个操作中的算法的股价,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
三、特点
通过把不变行为(固定的数据加载)搬移到超类,去除子类中的重复代码来体现他的优势(这里就算没有抽象行为,只要抽象方法也是可以的)。
他提供了一个很好的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,而我们需要吧不变的行为搬到单一的地方,这样就可以帮助子类摆脱重复的不变行为纠缠,而产生的重复代码
四、结构图

五、案例
AbstractClass
是抽象类,其实也就是“抽象模板” ,定义并实现了一个模板方法。
这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而且逻辑的组成步骤在相对应的抽象操作中,推迟到子类实现。
顶级逻辑也有可能调用一些具体方法(1.0项目中有用到,主要用于公共数据初始化)
package com.template.templateVersionTwo; /**
* 抽象类
*
* @author 王子威
* @date 2022/8/2
*/
public abstract class AbstractClass
{
/**
* 抽象行为
* 放到子类实现
*/
public abstract void primitiveOperationOne(); /**
* 抽象行为
* 放到子类实现
*/
public abstract void primitiveOperationTwo(); /**
* 模板方法
* 给出逻辑骨架
* 推迟子类实现
* 个人感觉:很像切面
*/
public void templateMethod()
{
primitiveOperationOne();
primitiveOperationTwo();
System.out.println("wzw");
}
}
ConcreteClass
实现父类所定义的一个或多个抽象方法
每个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不通实现,从而使得顶级逻辑的实现各不相同
ConcreteClassA
package com.template.templateVersionTwo; /**
* 具体实现类
*
* @author 王子威
* @date 2022/8/2
*/
public class ConcreteClassA extends AbstractClass
{
@Override
public void primitiveOperationOne()
{
System.out.println("具体A类方法1的实现");
} @Override
public void primitiveOperationTwo()
{
System.out.println("具体A类方法2的实现");
}
}
ConcreteClassB
package com.template.templateVersionTwo; /**
* 具体实现类
*
* @author 王子威
* @date 2022/8/2
*/
public class ConcreteClassB extends AbstractClass
{
@Override
public void primitiveOperationOne()
{
System.out.println("具体B类方法1的实现");
} @Override
public void primitiveOperationTwo()
{
System.out.println("具体B类方法2的实现");
}
}
TestTemplate
测试方法testVersionTwo
@Test
public void testVersionTwo()
{
AbstractClass abstractClass; abstractClass = new ConcreteClassA();
abstractClass.templateMethod(); abstractClass = new ConcreteClassB();
abstractClass.templateMethod(); }
测试结果

设计模式之“模板方法模式(TemplateMethod)”的更多相关文章
- 设计模式之模板方法模式 templateMethod
代码实现 public abstract class BankTemplateMethod { //具体方法 public void takeNumber(){ System.out.println( ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- 设计模式——模板方法模式(TemplateMethod Pattern)
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML图: 抽象模板: package com.cnblo ...
- 大话设计模式--模板方法模式 TemplateMethod -- C++ 实现
1. 模板方法模式: 定义一个操作中的算法骨架,而将一些操作延迟到子类, 模板方法模式使得子类可以不改变一个算法的结构既可以重定义该算法的某些特定步骤. 当不变和可变的行为在方法的子类实现中混在一起的 ...
- 设计模式之模板方法模式(TemplateMethod)
模板方法模式使用继承来实现模式的功能,在基类使用一个方法来定义算法的各个步骤,这些步骤(方法)的具体实现会放到子类中,通过这样来实现不同算法对象的算法拼合,完成该对象整体算法的实现. 作用 模板方法中 ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
随机推荐
- P9869 [NOIP2023] 三值逻辑 题解
NOIP2023 T2 三值逻辑 题解 题面 思路 乍一看好像很并查集,而且不太难,但是, 注意到:按顺序运行这 \(m\) 条语句 事情并没有那么简单. 比如说如下情况: x1:=T x2:=x1 ...
- NCS开发学习笔记-基础篇-前言
nRF5 SDK 与 nRF Connect SDK 目前Nordic有2套并存的SDK:老的nRF5 SDK和新的nRF Connect SDK(简称NCS),两套SDK相互独立. nRF5 SDK ...
- 07_读写文件open(filename, mode, encoding=None)
读写文件open(filename, mode, encoding=None) mode mode 权限 r 只读 w 只写(会从头开始覆盖覆盖写当前文件内容) a 追加写(从文件内容的末尾追加写内容 ...
- 【MATLAB习题】四杆机构的运动学参数求解
1.问题描述 2. 推导过程 3. matlab代码 最新版代码 直接采用求微分的方式得到角度,角速度等数值解,速度慢,但是代码少,容易看懂(矩阵看起来真难受). 以前做的一个博客文章用的是矩阵运算求 ...
- HIVE将长整数转字符串的错误
有一个超长字符串,比如:441066000000001005712973,原来存放在HIVE里表A 是用DECIMAL(24)类型.现在要与另外一个用string类型保存这个字段的表B关联,老是失败. ...
- 出现TypeError: float() argument must be a string or a number, not _NoValueType(机器学习 Win11)
博客地址:https://www.cnblogs.com/zylyehuo/ 如果出现以下报错 则说明是torch.numpy等库的版本不匹配 可以去以下网站寻找匹配的版本 https://mirro ...
- 【Linux】2.3 Linux目录结构
基本介绍 linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后在此目录下再创建其他的目录. 深刻理解 linux 树状文件目录是非常重要的,这里 ...
- 【Ubuntu】安装OpenSSH启用远程连接
[Ubuntu]安装OpenSSH启用远程连接 零.安装软件 使用如下代码安装OpenSSH服务端: sudo apt install openssh-server 壹.启动服务 使用如下代码启动Op ...
- awesome llm web ui
https://github.com/JShollaj/awesome-llm-web-ui Contents Streamlit Gradio Lobe Chat Text Generation W ...
- nodejs参数的处理与用户的交互
解析脚本参数 作为脚本或者命令行工具,一般都需要支持不同的用户参数.默认参数被保存在process.argv的数组中,如下: [ nodeBinary, script, arg0, arg1, ... ...