优秀程序员必备技能:设计模式之——模板模式

Python 中最简最好的设计模式 作为这么一门有前途也有钱途的语言,还有什么理由不去学习和掌握呢? 阅读详情

基本介绍

模板模式也被称为“模板方法模式”,该模式是行为型模式的一种,模板模式相对来说比较简单也比较容易理解。

该模式的实现思路是:在一抽象类中定义一个公开的模板方法,该方法规定了某一算法(也可称为功能)的执行流程,其子类可以按照需求重写类中的其它方法,但是整个算法将以模板方法定义的流程进行。

换言之,模板方法规定了一个算法的整体骨架(执行流程),并将一些具体步骤延迟到子类中,从而促使子类可以在不改变算法结构的前提下,就能做到重新定义该算法的一些特定操作。

通常情况下我们会在模板方法所在的父类中定义一个方法,该方法默认不做任何事情,子类可以根据自身情况重写它,此方法被称为“钩子方法”。钩子方法在模板模式中可有可无,不是必须存在的。

模板模式的UML类图

在这里插入图片描述

类图讲解

AbstractClass:抽象父类,定义并实现了模板方法,规定好了算法的执行流程。该类中也会存在一些其它抽象方法,用于让子类定制属于自己的特殊操作。
ConcreteClassA、ConcreteClassB:继承AbstractClass抽象类并实现该类中的抽象方法。
Client:客户端测试类。

案例讲解

咖啡制作

流程:挑选咖啡豆 => 研磨 => 冲泡 => 添加配料。
配料:牛奶、糖。

代码实现

咖啡 => 对应AbstractClass

public abstract class Coffee {

  /**
   * 模板方法,使用final修饰,不让子类重写。 该方法定义了咖啡的制作过程。
   */
  public final void make() {
    this.select();
    this.grind();
    this.infusion();
    if (this.customerWantCondiments()) {
      this.addCondiments();
    }
  }

  // 挑选材料
  private void select() {
    System.out.println("挑选好优质的咖啡豆!");
  }

  // 研磨
  private void grind() {
    System.out.println("将咖啡豆研磨成粉!");
  }

  // 冲泡
  private void infusion() {
    System.out.println("冲泡咖啡!");
  }

  // 添加配料。定义成抽象方法,让不同子类实现添加不同的配料。
  public abstract void addCondiments();

  /**
   * 是否需要添加配料。“钩子方法”
   */
  public boolean customerWantCondiments() {
    return true;
  }

}

不同口味的咖啡 => 对应AbstractClass的子类

/**
 * 加奶咖啡
 */
public class WhiteCoffee extends Coffee {

  @Override
  public void addCondiments() {
    System.out.println("添加牛奶!");
  }
}

/**
 * 加糖咖啡
 */
public class WithSugarCoffee extends Coffee {

  @Override
  public void addCondiments() {
    System.out.println("添加糖!");
  }
}

/**
 * 纯咖啡
 */
public class PureCoffee extends Coffee {

  @Override
  public void addCondiments() {
  }

  // 重写钩子方法
  @Override
  public boolean customerWantCondiments() {
    return false;
  }
}

客户端测试类

public class Cilent {

  public static void main(String[] args) {
    System.out.println("======制作加奶咖啡======");
    Coffee whiteCoffee = new WhiteCoffee();
    whiteCoffee.make();
    System.out.println("======制作加糖咖啡======");
    Coffee withSugarCoffee = new WithSugarCoffee();
    withSugarCoffee.make();
    System.out.println("======制作纯咖啡======");
    Coffee pureCoffee = new PureCoffee();
    pureCoffee.make();
  }
}

执行结果

在这里插入图片描述

总结

1、算法(流程)只存在于父类中,这样有利于对算法的修改与维护,只要变更父类就可以使其子类继承相应的修改。

2、模板模式中父类的模板方法和一些已经实现的方法可以直接被子类使用,从而实现代码的最大化复用。

3、模板模式即统一了算法(流程),也提供了很大的灵活性(像上面案例中添加配料一样)。

4、缺点:每一个不同的实现都需要新增一个子类,会导致类的个数增加,使系统变得庞大。

5、注意:父类的模板方法一般都使用final修饰,从而防止子类重写。

6、使用场景:当某一项功能是需要通过执行一系列操作来完成的,并且这一系列的操作基本相同,只有部分操作存在差异时我们就可以考虑使用模板方法。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

优秀工程师必备的一项技能,你解锁了吗? 阿里妹导读:很多程序员在工作一段时间后会遇到迷茫期,虽有技术傍身,也难免会产生焦虑,反复思考怎样才能快速成长。关于如何提高自己的思考力,运用思考的力量推动能力提升,以此实现技术成长,阿里巴巴盒马产品技术部的岩动总结了一套思考方法,分享给每个正在成长的程序员。(本篇文章较长,阅读时间约30分钟,建议收藏后,找一个合适的时间慢慢品读哦) 引言 我们来看一下几类在程序员成长、发展的常见问题,如果... 阅读详情

相关推荐

设计模式概论:封装变化

设计模式概论 1. 设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 模式.................................

黄规速博客:学如逆水行舟,不进则退 1万+

程序员必知的23种设计模式之模板模式

文章目录1. 模式引出-豆浆制作问题2. 模板方法模式基本介绍2.1 模板方法模式的原理类图2.2 模板方法模式的钩子方法3. 方案实现4. 模板方法模式在Spring4框架的应用5. 模板方法模式的注意事项和细节 1. 模式引出-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆,也可以不添加调料 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 请使用

ECHO的博客 607

《Java十大经典案例》源代码

《Java十大经典案例》源代码,很丰富,很经典的案例,值得一看

面试感悟----一名3年工作经验的程序员应该具备的技能

原文地址http://www.cnblogs.com/xrq730/p/5260294.html,转载请注明出处,谢谢!   前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向咱们Java程序员的。 简单先说一下,LZ坐标杭州,13届本科毕业,算上年...

weixin_33860553的博客 1万+

DeepSeek跨会话协作指南:让AI成为你的「第二大脑」

通过DeepSeek的跨会话协作系统,用户实测工作效率提升63%。

紫夜若涵的博客 1475

2025海外代理IP深度横评:Bright Data、IPFoxy、SmartProxy等六大服务商实战对比

本文深度横评2025年六大海外代理IP服务商(Bright Data、IPFoxy、SmartProxy、IPIPGO、Kookeey及青果网络),基于实战测试数据,从IP池质量、速度稳定性、性价比等维度进行对比。针对跨境电商、数据爬虫、社交媒体管理等不同业务场景,提供精准的选购指南与避坑建议,帮助企业用户根据自身需求选择最合适的代理IP解决方案。

weixin_29196891的博客 435

简单易懂23种设计模式——模板方法模式【含C++代码实例】

23种设计模式C++实现——模板方法模式    在做面向对象的软件开发时我们往往想达到更高的代码可复用性和更合理的软件颗粒度。   根据《设计模式——可复用面向对象软件的基础》所说:“你必须找到相关的对象,以适当的颗粒度将他们回归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。”   内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用的解决方案。这些重复的模式方案解决特定的问题,使得面向对象的设计

机器人梦想家 Bing Lee 2901

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2880

设计模式——模板方法模式(附代码示例)

一. 概念 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。 二. 原理类图 Abstra...

枫陵的博客 1476

《21天学通C++》阶段性成果测试题——hstring(手写string类)

总体考察了类的使用,缓冲区考察了指针和数组的使用、增删改查、考察编码思维、考察了类的重载。1.初始化子字符串的起始位置为-1,表示未找到,若buffer或findHstring为空,则返回-1。右边的字符串不为空,则分别获取母串和子串的长度(用循环),然后创建一个固定大小的数组。3.然后循环遍历寻找子串在母串中的起始位置,循环时可以通过两个长度相减,避免循环越界。2.如都不为空,则分别获取双方的字符串长度(用循环),然后。右边的字符串为空,则输出原来的字符串。是否为空,有一方为空则返回另一方。

立志成为炼丹师? 1265

遗传算法优化光学超表面:智能设计突破纳米结构瓶颈

光学超表面设计本质上是一个高维、非线性、离散每个结构单元(如纳米砖柱、孔洞、十字架)有多个参数(长、宽、高、旋转角、材料),整个阵列的参数组合数量随单元数指数级增长。性能指标(如聚焦效率、工作带宽、偏振转换率、特定角度响应)往往无法用简单解析式表达,需依赖计算密集型电磁仿真(如FDTD, FDFD, RCWA)来评估。结构参数微小变化可能引起光学响应的剧烈跃变,目标函数存在多个局部最优解。实际制造通常要求结构参数取自有限的离散值(如特定刻蚀深度、材料库)。

weixin_51101456的博客 1142

代码模板在哪里_优秀程序员必备技能:设计模式之——模板模式

基本介绍模板模式也被称为“模板方法模式”,该模式是行为型模式的一种,模板模式相对来说比较简单也比较容易理解。该模式的实现思路是:在一抽象类中定义一个公开的模板方法,该方法规定了某一算法(也可称为功能)的执行流程,其子类可以按照需求重写类中的其它方法,但是整个算法将以模板方法定义的流程进行。换言之,模板方法规定了一个算法的整体骨架(执行流程),并将一些具体步骤延迟到子类中,从而促使子类可以在不改变算...

weixin_42507981的博客 222

【硬件的单元测试 UT 3】PCIe 3.0及信号完整性测试方法

PCIe标准自从推出以来,1代和2代标准已经在PC和Server上逐渐普及,用于满足高速显卡、高速存储设备对于高速数据传输的要求。出于支持更高总线数据吞吐率的目的,PCI-SIG组织在2010年制定了PCIe 3.0,即PCIe 3代的规范,数据速率达到8Gbps。

qq_43416206的博客 1415

求职必备||程序员的优秀简历都是这样来的

本文转自知乎号:“汇智动力学院”,转载请注明出处。   年味散尽,回家相亲的日子也告一段落,不管结局怎样,奋斗的一年又开启了。“金三银四”的求职期已来,抢人大战即将上演,准备求职的你,简历是否已经准备好了呢?   一份优秀的简历,可以大大提高面试的机会!虽说资历有深浅,技术有高低,但是有技巧的将这项素材呈现在简历中,将会为简历加不少分。程序员一份优秀简历的出炉,大致会经历以下四个阶段。 ...

成都汇智动力的博客 3023

基于Django+Vue3的目标检测系统设计与实现,Web前后端分离,Vue3前台系统+Django后台管理系统开发,YOLOv11 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

基于Django+Vue3的智能目标检测系统设计与实现,Web前后端分离,YOLOv11 Web目标检测,Vue3前台系统+Django后台管理系统开发,实现图片检测、视频检测、摄像头检测、登录、注册和个人中心功能

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3668

S32K1XX Autosar开发实战|全网独家复现EB MCAL Port/Dio配置、详解引脚分层原理、实现经典跑马灯助力车载IO电控落地

在NXP S32K1XX系列车规MCU的AUTOSAR标准开发体系中,MCAL(微控制器抽象层)是软硬件解耦的核心载体,而Port端口模块与Dio数字IO模块是MCAL最基础、最核心的入门模块,也是车载指示灯、按键检测、继电器驱动、外设硬件启停控制的底层支撑。区别于传统裸机直接操作寄存器的开发方式,AUTOSAR架构采用分层隔离设计,Port负责硬件静态初始化、Dio负责动态电平操控,严格遵循车规级开发规范,杜绝硬件资源冲突、引脚配置混乱等问题。

getusushu的博客 44

高薪Java工程师必备技能分享:设计模式与框架

Java是老牌编程语言,人才需求大、应用范围广、薪资福利好。有很多人从事Java开发,但其薪资却存在较大的差异,有的人能够轻松实现月薪过万,有的人却在几千内徘徊。Java新手如何实现升职加薪?分享高薪Java工程师必备的技能之设计模式与框架。 Java设计模式 Java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种...

xiaoxijing的博客 597

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问:         为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。         为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置;而自己将代码改了又改,删了又建,几乎晕厥,最后只能推翻重来。         为什么大牛写完的程序测试上线后,几乎完美运行,用户无懈可击;而自己的程序bug重重,改好

三级小野怪的专栏 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

优秀软件开发大佬的技能树!

开发人员是软件项目的核心力量,他们负责将设计转化为可运行的代码,实现业务逻辑,确保系统的稳定、高效运行。

日拱一卒,玉汝于成 2248

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java rowmapper 通用实现_高薪Java工程师必备技能分享:设计模式与框架

Java是老牌编程语言,人才需求大、应用范围广、薪资福利好。有很多人从事Java开发,但其薪资却存在较大的差异,有的人能够轻松实现月薪过万,有的人却在几千内徘徊。Java新手如何实现升职加薪?千锋石家庄Java培训小编分享高薪Java工程师必备的技能之设计模式与框架。Java设计模式Java的设计模式大体上分为三大类:创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。...

weixin_29208327的博客 89

Java开发工程师升职加薪必备技能:Java设计模式与框架

Java是老牌编程语言,人才需求大、应用范围广、薪资福利好。有很多人从事Java开发,但其薪资却存在较大的差异,有的人能够轻松实现月薪过万,有的人却在几千内徘徊。Java新手如何实现升职加薪?千锋重庆Java培训小编分享高薪Java工程师必备的技能之设计模式与框架。 ​ Java设计模式 Java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型

qf2019的博客 113

Java基础知识点,Java技能图谱,Java技术人员必备的知识技能树

Java技术的世界是多元而复杂的,需要程序员不断学习。想入行必须做好吃苦的准备。而要想作为互联网Java工程师基础技能是必须要掌握的,下面为大家分享Java编程八大技能。 Java编程八大技能 1.Core Java,就是Java基础、JDK的类库,很多同学都经常跟我说,JDK我懂,但是懂还是不精,当然知其然更要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类。 比如String,集合类(List,Map,Set)等数据结构要知道它们的实现,不同的集合类有什么区别,然后才能知道在.

qq_41293655的博客 550

java与模式_高薪Java工程师必备技能分享:设计模式与框架

Java是老牌编程语言,人才需求大、应用范围广、薪资福利好。有很多人从事Java开发,但其薪资却存在较大的差异,有的人能够轻松实现月薪过万,有的人却在几千内徘徊。Java新手如何实现升职加薪?千锋石家庄Java培训小编分享高薪Java工程师必备的技能之设计模式与框架。Java设计模式Java的设计模式大体上分为三大类:创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。...

weixin_39985820的博客 79
上一篇: 了解代理模式这一篇文章就够了
下一篇: 设计模式系列:一文带你了解“命令模式”
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值