一、使用场景

场景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)”的更多相关文章

  1. 设计模式之模板方法模式 templateMethod

    代码实现 public abstract class BankTemplateMethod { //具体方法 public void takeNumber(){ System.out.println( ...

  2. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  3. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  4. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  5. 设计模式——模板方法模式(TemplateMethod Pattern)

    模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML图: 抽象模板: package com.cnblo ...

  6. 大话设计模式--模板方法模式 TemplateMethod -- C++ 实现

    1. 模板方法模式: 定义一个操作中的算法骨架,而将一些操作延迟到子类, 模板方法模式使得子类可以不改变一个算法的结构既可以重定义该算法的某些特定步骤. 当不变和可变的行为在方法的子类实现中混在一起的 ...

  7. 设计模式之模板方法模式(TemplateMethod)

    模板方法模式使用继承来实现模式的功能,在基类使用一个方法来定义算法的各个步骤,这些步骤(方法)的具体实现会放到子类中,通过这样来实现不同算法对象的算法拼合,完成该对象整体算法的实现. 作用 模板方法中 ...

  8. 【GOF23设计模式】模板方法模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...

  9. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...

  10. java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)

    定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...

随机推荐

  1. 满血 DeepSeek 现可无需等待免费使用暨第三方 API 平台横评

    亮点:高可用的 API 平台,新人免费 100 万 token ,DeepSeek-R1 (671B)与 DeepSeek-V3 模型享五折优惠,活动时间为2025年02月12日18:00:00~20 ...

  2. Spring单元测试(一)入门与实践

    问题:如何快速测试,而不是每次测试都要重启应用? 目标:尽量只测试局部代码 不同的测试 软件工程中分为:单元测试.集成测试.功能测试.系统测试.其中功能测试和系统测试一般是测试人员的责任,但单元测试和 ...

  3. Qt项目下pro文件设置库路径

    问题 正常情况下我们会将工程的路径用一个变量来储存 例如: PROJECT_DIR=/home/$$(USER)/svn/embd_linux/app 然后后面的变量引用这个变量,例如: INCLUD ...

  4. FANUC发那科机器人控制箱维修操作流程

    FANUC发那科机器人在工业自动化领域中占有重要地位,其高效.稳定和精确的性能赢得了众多用户的青睐.然而,随着使用时间的增长,可能会出现FANUC机器人控制柜故障,影响到发那科机器人的正常运行.本文将 ...

  5. Linux 提升CPU利用率

    由于同学项目CPU利用率不高,客户要降他们服务器配置,所以下下策. # 提升一个核CPU利用率 cat /dev/urandom | gzip -9 > /dev/null # 提升更大的CPU ...

  6. MybatisPlus - [01] 概述

    MybatisPlus可以节省我们大量工作时间,所有的CURD代码它都可以自动化完成! 一.是什么   MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,其设计目的是在不改变My ...

  7. FastAPI路由:微服务架构下的路由艺术与工程实践 🌐

    title: FastAPI路由专家课:微服务架构下的路由艺术与工程实践 date: 2025/3/4 updated: 2025/3/4 author: cmdragon excerpt: 用API ...

  8. angular+ionic项目,页面无法滚动的问题

    在做angular+ionic+cordova项目时,遇到一个小小的问题,就是内容做完,页面无法滚动,导致内容显示不完整 首先我检查了样式,发现并没有给页面定死高度,再次检查结构发现,我并没有用ion ...

  9. 事务及mysql中的隔离级别

    事务,一个或一组sql语句组成的执行单元,是最小的执行单元,要么全执行,要么全不执行.如果单元中某条sql语句执行失败,整个单元将会回滚,所有受影响的数据返回到事务开始前的状态. 事务具有ACID四个 ...

  10. AI编程:最疯狂的MCP服务器你一定要试试

    我还记得我第一次听说MCP(模型上下文协议)的时候,我心想: "哈?又一个花里胡哨的缩写,这个世界已经快被这些缩写淹没了!" 但当我意识到MCP就像AI界的通用连接器--就像USB ...