设计模式—— 十 :模板方法模式

设计模式——模板方法模式 是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。但调用将以抽象类中定义的方式进行。建议将算法或者一个系统的某个功能分解为一系列步骤, 然后将这些步骤改写为方法, 最后在 “模板方法” 中依次调用这些方法。步骤可以是抽象的, 也可以有一些默认的实现。为了能够使用算法, 客户端需要自行提供子类并实现所有的抽象步骤。如有必要还需重写一些步骤 (但这一步中不包括模板方法自身)。抽象final必须可以工厂方法模板方法模板方法策略。 阅读详情

什么是模板方法模式?

模板方法模式(Template Method Pattern)定义如下:

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改 变一个算法的结构即可重定义该算法的某些特定步骤。)

模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。

模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关 系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类 来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一 个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

模板方法模式的通用类图如下:

图10-1:模板方法模式通用类图

在这里插入图片描述

模板方法模式包含如下两个角色:

  • (1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基 本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中 可以重定义或实现这些步骤。
    它的方法分为两类:

  • 基本方法:基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
  • 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度, 完成固定的逻辑。
  • (2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作 以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

具体代码:

  • 抽象模板类:
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">AbstractClass</span> { 
  <span style="color:#a0a1a7"><em>//基本方法 </em></span>
  <span style="color:#a626a4">protected</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">doSomething</span>();
  <span style="color:#a0a1a7"><em>//基本方法 </em></span>
  <span style="color:#a626a4">protected</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">doAnything</span>(); 
  <span style="color:#a0a1a7"><em>//模板方法 </em></span>
  <span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">templateMethod</span>(){ 
  <span style="color:#a0a1a7"><em>/** 调用基本方法,完成相关的逻辑 */</em></span> 
  <span style="color:#c18401">this</span>.doAnything(); <span style="color:#c18401">this</span>.doSomething(); 
  } 
}
</code></span></span>

  • 具体模板类:
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">ConcreteClass1</span> <span style="color:#a626a4">extends</span> <span style="color:#4078f2">AbstractClass</span> { 
   <span style="color:#a0a1a7"><em>//实现基本方法 </em></span>
   <span style="color:#a626a4">protected</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">doAnything</span>() { 
     <span style="color:#a0a1a7"><em>//业务逻辑处理 </em></span>
   }
   <span style="color:#a626a4">protected</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">doSomething</span>() { 
   <span style="color:#a0a1a7"><em>//业务逻辑处理 </em></span>
   } 
}

<span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">ConcreteClass2</span> <span style="color:#a626a4">extends</span> <span style="color:#4078f2">AbstractClass</span> {
  <span style="color:#a0a1a7"><em>//实现基本方法 </em></span>
  <span style="color:#a626a4">protected</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">doAnything</span>() { 
    <span style="color:#a0a1a7"><em>//业务逻辑处理 </em></span>
  }
  <span style="color:#a626a4">protected</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">doSomething</span>() { 
    <span style="color:#a0a1a7"><em>//业务逻辑处理 </em></span>
  } 
}
</code></span></span>

  • 场景类:
复制代码
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Client</span> { 
  <span style="color:#a626a4">public</span> <span style="color:#a626a4">static</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">main</span>(String[] args) { 
    <span style="color:#986801">AbstractClass</span> <span style="color:#986801">class1</span> <span style="color:#ab5656">=</span> <span style="color:#a626a4">new</span> <span style="color:#4078f2">ConcreteClass1</span>(); 
    <span style="color:#986801">AbstractClass</span> <span style="color:#986801">class2</span> <span style="color:#ab5656">=</span> <span style="color:#a626a4">new</span> <span style="color:#4078f2">ConcreteClass2</span>(); 
    <span style="color:#a0a1a7"><em>//调用模板方法 </em></span>
    class1.templateMethod(); 
    class2.templateMethod(); 
  } 
}
</code></span></span>

抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露 的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。

模板方法模式的应用

模板方法模式的优点

● 封装不变部分,扩展可变部分 把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。 在悍马模型例子中,是不是就非常容易扩展?例如增加一个H3型号的悍马模型,很容易 呀,增加一个子类,实现父类的基本方法就可以了。

● 提取公共部分代码,便于维护我们例子中刚刚走过的弯路就是最好的证明,如果我们不抽取到父类中,任由这种散乱的代码发生,想想后果是什么样子?维护人员为了修正一个缺陷,需要到处查找类似的代码!

● 行为由父类控制,子类实现 基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。

模板方法模式的缺点

需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导 致类的个数增加,系统更加庞大,设计也更加抽象。

模板方法模式的使用场景

● 多个子类有公有的方法,并且逻辑基本相同时。

● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。

● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。

告别手动连接!一键搞定Mumu模拟器与Android Studio的ADB配置 本文详细介绍了如何通过编写自动化脚本,一键完成Mumu模拟器与Android Studio的ADB连接配置。告别繁琐的手动命令输入,该脚本能智能检查环境、判断连接状态并自动处理端口转发,显著提升Android开发者的调试与测试效率。 阅读详情

相关推荐

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五)设置控制台的键盘映射 命令介绍 localectl 命令可用于查询与修改系统的本地化(locale)与键盘布局的设置。 它通过与 systemd-localed.service 通信来修改例如 /etc/locale.conf 与 /etc/vconsole.conf 之类的配置文件。本地化设置控制着 用户界面的语言、字符类型与字符编码、 日

liaowenxiong的博客 5401

15.模板方法模式

豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎,流程是固定的,只是其中的某一步骤是不一样的 通过添加不同的配料,可以制作出不同口味的豆浆 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单, 很容易就想到这个方案,因此就直接使用,不再使用传...

weixin_43719015的博客 531

开关电源的纹波和噪声电压-抑制方法

开关电源(包括AC/DC转换器、DC/DC转换器、AC/DC模块和DC/DC模块)与线性电源相比较,最突出的优点是转换效率高,一般可达80%~85%,高的可达90%~97%;其次,开关电源采用高频变压器替代了笨重的工频变压器,不仅重量减轻,体积也减小了,因此应用范围越来越广。 但开关电源的缺点是由于其开关管工作于高频开关状态,输出的纹波和噪声电压较大,一般为输出电压的1%左右(低的为输出电压的0.5%左右),最好产品的纹波和噪声电压也有几十mV;而线性电源的调整管工作于线性状态,无纹波电压,输出的噪声电压也

ltqdxl的博客 1万+

设计模式 ( 十五 ) 模板方法模式

一、概念 概念:模板方法模式,又叫模板模式,在抽象类中定义一个执行方法的模板,子类可以根据需要重写其中的方法,简单理解就是为其他子类提供一个算法框架。模板方法模式属于行为型模式,是借助于继承来实现的。 通用UML类图: 角色分析: 抽象模板(Abstract Template)角色:定义了模板方法以及整个实现的大体步骤,具体的子类需要实现其中的抽象方法;(抽象基类定义算法框架) 模...

weixiaohuai的博客 623

从Gotham到Foundry:拆解Palantir三大产品线,看它如何用‘本体’统一企业数据与AI

本文深入解析Palantir的三大产品线Gotham、Foundry和Apollo,揭示其如何通过独特的'本体'架构实现企业数据与AI的无缝融合。从国防情报到商业决策,Palantir的产品架构展现了强大的数据整合与AI赋能能力,为企业构建数字孪生提供革命性解决方案。

weixin_30823001的博客 322

ROS2新手必看:5分钟搞定Gazebo机器人仿真环境搭建(含避坑指南)

本文为ROS2新手提供了在Gazebo中快速搭建机器人仿真环境的详细指南。内容涵盖ROS2与Gazebo的协同架构理解、基础环境配置、机器人模型构建、传感器集成以及环境创建,并包含实用的避坑指南和调试技巧,帮助开发者高效掌握物理仿真技术。

weixin_29100927的博客 430

设计模式 c++版(4)——模板方法模式

定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 示例一:模板方法模式(通用版) 1. 类图10-3 2. 类图说明: AbstractClass 叫抽象模板,他的方法分为两类: 基本方法:即基本操作,是由子类实现的方法,并且在模板方法被调用。 模板方法:可以有一个或几个,一般是一个具体方法,即一个框架,实现对...

Jecklin_online的博客 473

【系统架构设计师】论文:论虚拟现实技术的应用与发展

虚拟现实技术是当前科学研究的热点,同时也是国家大力支持发展的核心技术之一。所谓虚拟现实,就是通过计算机等虚拟手段来构造一个非常接近真实世界的虚拟环境,它主要体现在视觉、触觉、嗅觉等方面的逼真模拟来达到高度的沉浸性,也就是如我们通常所说的“身临其境”。

数据知道的博客 1万+

【设计模式】Java设计模式——模板方法模式(Template Pattern)

【设计模式】Java设计模式——模板方法模式

Dust_heart的博客 2314

宇树G1开发实践--PPT汇报(遥控版)

本文介绍了一种基于遥控器交互的机器人演示控制系统。系统通过DDS中间件接收遥控器信号,采用位掩码边沿检测技术实现按键精准响应,将不同按键映射为播放控制命令(暂停/重播、跳转、跳过等)。核心交互逻辑包含主播放循环、命令处理和暂停机制,支持播放过程中的实时控制。与自动顺序播放版相比,该系统显著提升了演示灵活性,适用于需要人机互动的演讲场景。使用前需确保网络连接和设备安全,并熟悉按键功能映射。该系统实现了专业级的人机协同演示体验。

m0_47999117的博客 680

[PCIE5.0] 4.2.3.2 Encoding of Presets

• 发射器预设:发射器预设值用4位二进制编码,表示不同的预设设置(P0 到 P10),这些设置定义了信号的传输特性。• 接收器预设提示:接收器预设提示是通过3位二进制编码告诉接收器建议的增益值,用于调整接收器的灵敏度(适用于8.0 GT/s数据速率)。

系统固件工程师 575

行为型设计模式——模板方法模式

模板方法模式(Template pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤。

庄小焱 999

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式(十):模板方法模式

1、整体框架 2、介绍 2.1、定义 模版方法模式:定义一个模版结构即抽象,将具体内容延迟到子类去实现 2.2、作用 模版方法模式是基于继承的。在不改变模版结构的前提下,在子类中重新定义模版中的内容。 2.3、解决的问题 提高代码的复用性:将相同部分的代码放在抽象类的父类中,而将不同的代码放到不同的子类中。 实现反向控制:通过父类调用子类的操作,并通过子类的具体实现扩展不同的行为,实现反向控制。 3、认识模版方法模式 3.1、变与不变 程序设计的一个很重要的思考点就是“变与不变...

mingyuli的博客 1799

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式(十):模板方法模式

设计模式(十):模板方法模式 一、概述   模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 二、结构类图    三、解决问题   模板方法就是提供一个算法框架,框架里面的步骤有些是父类已经定好的,有些需要子类自己实现。相当于要去办一件事情,行动的流程已经定好了,但有些步骤需要自己去做,...

Bballchen的博客 398

【专题系列】搞定设计模式—— 十 :模板方法模式

点击上方“java大数据修炼之道”,选择“设为星标”优质文章, 第一时间送达来源 |https://www.cnblogs.com/three-fighter/p/12590857.h...

hello world! 345

JavaScript设计模式(十):模板方法模式实现与应用

先把一个流程的整体骨架定义好,再把其中可以变化的步骤延迟到子类里去实现。整体流程先定好。哪些步骤必须做,也先定好。哪些步骤允许不一样,再交给子类自己实现。它的重点不在“某一个步骤怎么写”,而在“先把流程骨架稳定下来。

程序员小寒的博客 453

Java设计模式之十:模板方法模式(Template Method)

本文继续介绍23种设计模式系列之模板方法模式。 概述 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。 比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结

zhengcs的博客 228

大话设计模式十:模板方法模式(考题抄错会做也白搭)

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模版方法模式是通过把不变行为搬移到超类,取出子类中的重复代码来体现它的优势。 //AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑骨架,而逻辑的组成步骤在相应的抽象...

凤凰涅槃 212

【设计模式】之模板方法模式

今天给大家介绍23种设计模式中的模板方法模式,这个设计模式在Spring框架中还是挺常见的,手写Spring源码的小伙伴必须要掌握的设计模式之一,文章结构还是经典的三连问,是什么?为什么?怎么用?🌈

小杰不秃头的博客 1569

设计模式之 模板方法模式

模板方法模式是行为型设计模式的一种。它定义了一个算法的骨架,并将某些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些特定步骤。模板方法模式的核心在于:模板方法模式的核心是一个“模板方法”,它通常是一个在父类中定义的具体方法,里面包含了步骤的调用,而步骤的具体实现交给子类。下面是模板方法模式的基本结构:抽象类(Abstract Class):具体类(Concrete Class):模板方法(Template Method):假设我们正在设计一个做菜的程序。做菜的步骤大致是

2403_82445975的博客 2428

【设计模式】Java 设计模式之模板方法模式(Template Method)

模板方法模式是一种灵活且强大的设计模式,通过抽象类和具体子类的组合,实现算法结构的灵活扩展。它遵循开闭原则,对扩展开放,对修改封闭,提高了代码的可维护性和可扩展性。该模式与面向对象设计的其他原则和实践紧密相关,如单一职责原则和接口隔离原则。然而,在使用时也需注意避免过度使用导致类数量增加。模板方法模式广泛应用于各种实际项目中,如在线支付系统、文件处理、Web开发等,可帮助构建通用的流程并允许自定义逻辑。通过深入理解其原理和注意事项,并结合实际应用,我们可以更好地利用模板方法模式提升软件系统的性能和可维护性。

新手村长的专栏 3644

C++设计模式-模板方法模式

目录 基本概念 例子和实例 基本概念 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构图如下(此图来自大话设计模式): 模板方法模式是通过把不变行为搬移到超类中,去除子类中的重复代码来提现他的优势。 模板方法模式提供了一个很好的代码复用。 当不变和可变的行为在方法...

IT1995的博客 6077

【设计模式21】模板方法模式

模板方法模式是一种行为设计模式,它通过定义算法的骨架而将某些步骤延迟到子类中实现。该模式适用于处理具有固定流程但具体实现可能变化的业务场景(如电商报表生成ETL流程)。核心结构包括抽象类(定义模板方法和公共逻辑)和具体子类(实现特定步骤)。模式优势在于提高代码复用性、减少重复代码、便于维护统一流程逻辑,同时允许子类灵活实现细节。关键实现要点包括:1) 使用final修饰模板方法防止子类修改流程;2) 抽象方法强制子类实现;3) Hook方法提供可选扩展点。示例通过报表生成器展示了数据提取、转换、输出等步骤的

专注后端技术架构,AI技术分享 1538
上一篇: 设计模式—— 九 :抽象工厂模式
下一篇: 设计模式—— 十 一:建造者模式
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值