设计模式-模板方法(TemplateMethod)

点云最小二乘法拟合曲线 文章目录一、引言 一、引言 阅读详情

什么是模板方法设计模式?

使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写);

解决的问题?

1、当功能内部一部分是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

2、编写一个抽象方法,父类提供了多个子类的通用方法,并把一个或者多个方法留给子类去实现,就是一种模板模式。

这个博主有详细解释,看完茅塞顿开,链接:https://blog.youkuaiyun.com/u013565163/article/details/79285617

此篇文章只为记录上面这个链接,方便以后自己复习。以下内容为Copy其他博主。

案例场景:

小张的团队最近接受一个需求,实现实现一家咖啡店的冲泡咖啡和茶的冲泡自动化。之前这家咖啡店都是由咖啡师傅手动进行调制咖啡和茶。现在咖啡店需要引入自动化的点单和调制饮料的系统,小张负责实现调制饮料的功能。

咖啡师傅手工冲泡咖啡和茶的流程:

冲泡咖啡:

1、把水煮沸
2、用沸水冲泡咖啡
3、把咖啡倒入杯子
4、加糖和牛奶

 

冲泡茶:

1、把水煮沸
2、用沸水冲泡茶叶
3、把茶倒入杯子
4、加柠檬
 

模版方法
模版方法实现冲泡咖啡


小张去了解了一下模版方法。针对上述冲泡步骤进行了思考。应该有一个抽象的对象来描述冲泡饮料这一行为,并且抽象的类实现了具体冲泡对象的共性步骤也就是1.把水煮沸和3.把饮料倒入杯子。有两个具体的子类来具体实现冲泡茶和咖啡。 
并且有些客户不需要加调料,那么需要对最后一步进行判断,是否添加调料。
 

代码实现

冲泡饮料的抽象类

 

package xuelongjiang.designpartten.templatemethod;

/**
 *
 * 模板方法
 *
 *
 * @Author xuelongjiang
 */
abstract   public class CaffeineBeverage {

    //算法。 抽象类的算法是final 的不允许被子类修改
     public final  void   prepareRecipe(){

         //算法的具体步骤
         boilWater(); //烧水
         brew();//冲泡
         pourInCup();// 把饮料倒入杯子
         if(hook()){
             addCondiments();// 加调料
         }

    }


   public  abstract  void brew();

   public   abstract  void addCondiments();


    public void boilWater(){

        System.out.println("烧水");
    }


    public  void pourInCup(){
        System.out.println("把饮料倒入杯子");
    }

    /**
     *  钩子,具体实现可以对算法步骤做一些控制
     *
     * @return
     */
    public boolean hook(){
        return true;
    }

}

 

       可以看到我们在冲泡咖啡/茶的抽象类中有一个hook方法,这个方法就是钩子方法。默认返回true,如果冲泡咖啡默认是加调料的那么子类就不用重写hook方法。

咖啡类

package xuelongjiang.designpartten.templatemethod;

/**
 * @Author xuelongjiang
 */
public class Coffee extends  CaffeineBeverage {


    @Override
    public void brew() {
        System.out.println("用沸水冲泡咖啡粉");
    }

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

    @Override
    public boolean hook() {
        return super.hook();
    }
}

茶类

package xuelongjiang.designpartten.templatemethod;

/**
 * @Author xuelongjiang
 */
public class Tea extends  CaffeineBeverage {


    @Override
    public void brew() {
        System.out.println("用沸水侵泡茶叶");
    }

    @Override
    public void addCondiments() {
        System.out.println("加柠檬");
    }


    @Override
    public boolean hook() {
        return super.hook();
    }
}

 

测试类

package xuelongjiang.designpartten.templatemethod;
/**
 * @Author xuelongjiang
 */
public class TemplateMethodTest {


    public static void main(String[] args) {
        CaffeineBeverage caffeineBeverage = new Tea();
        caffeineBeverage.prepareRecipe();

        System.out.println("-------------------");

        caffeineBeverage = new Coffee();
        caffeineBeverage.prepareRecipe();


    }
}

 

总结要点

模版方法定义了算法的步骤,把这些步骤的实现延迟到了子类。
模版方法模式为我们提供了一种代码复用的重要技巧。
模版方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
为了防止子类改变模版方法中的算法,可以将模版方法声明为final
模版方法和策略模式都封装了算法,一个用组合(策略模式),一个用继承(模版方法)。
 

KingSCADA3.8保姆级安装教程 大家好,我是雷工!最近开始学习KingSCADA,今天这篇详细记录安装KingSCADA3.8的过程。首先下载需要的安装版本,此处以从官网下载的最新版本KingSCADA3.8为例,双击:Setup.exe; 阅读详情

相关推荐

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1411

Java 实现模板方法(TemplateMethod)模式

类图 /** * 业务流程模板。提供基本框架 * @author stone * */ public abstract class BaseTemplate { public abstract void part1(); public abstract void part2(); public abstract void part3(); //这里为了严...

weixin_33770878的博客 150

新手必看:SMIC 0.18um PDK安装保姆级教程(附Cadence IC617环境配置)

本文提供SMIC 0.18um PDK在Cadence IC617环境下的详细安装教程,涵盖环境准备、文件解压、安装脚本运行、环境变量配置及Cadence集成验证等关键步骤,特别针对初学者常见问题提供解决方案,助力快速掌握芯片设计工具配置。

weixin_30522183的博客 497

模板方法(Template Method) Java实现

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

CmdSmith的博客 1052

机器人系统能用MQTT5.0代替ROS2吗?

更为灵活和友好的方案是通过把ROS(Robot Operating System)与MQTT(Message Queuing Telemetry Transport)协议相结合的解决方案,利用MQTT的轻量级、跨平台和广泛适用性特点,扩展ROS系统的通信能力,或将非ROS系统接入ROS网络。

QzmAIoT 2165

【C++】auto关键字(C++11,超详细解析,小白必看系列)

本文详细解析了C++中的“auto”关键字,介绍了其定义、基本用法、限制和高级用法,特别是与范围for循环和Lambda表达式结合的应用。

m0_73494049的博客 6万+

抽象类 ---模板方法

抽象类 抽象方法 没有方法体的方法,就是抽象方法。 abstract修饰符修饰 抽象方法只是用来定义规范的。告诉子类应该做什么,具体怎么做,不同的子类有不同的实现 不能私有、静态、final 抽象类: 用abstract修饰的类就是抽象类 有抽象方法的类,必须是抽象类 抽象类不能创建对象,构造方法只是在子类中调用来初始化参数的。 怎么的类可以定义抽象类 如果你这个类不想让别人创建对象。就抽象 如果你这个类中的方法没有实现的意义,定义为抽象 子类继承了一个抽象类,必须重写(实现)抽

小鬼的博客 596

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

使用Python、Selenium实现问卷星自动填写,内含适配个人问卷的方法。

DaenCode的博客 3840

浅谈Java设计模式(十四)模板方法模式(Template Method)

前言: 解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图: 就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCal

比较喜欢、笑的博客专栏 7083

机器学习实战1-四种算法对比对客户信用卡还款情况进行预测与模型评估

大家好,我是微学AI,今天给大家带来一个机器学习实战案例:利用机器学习的四种算法对比对客户信用卡还款情况进行分类。信用卡又叫贷记卡,是由商业银行或信用卡公司对信用合格的消费者发行的信用证明。现在的年轻人,特别是80后,90后甚至00后到喜欢超前消费,每个人名下多多少少都有至少一张信用卡,有些人由于过度超前消费,导致下个月无法还款导致的逾期,这样会对个人征信产生影响,今天我们就来分析分析具有哪些特性的人会有信用卡逾期的可能。

微学AI的博客 4710

ISO13849功能安全从入门到精通(3):安全功能及其对降低风险的贡献4

例如,如果机器必须在有限速度下运行时进行设置,那么在低加速度值下进行设置时,参数P1将是正确的选择:随着危险缓慢出现并给予足够的运动自由,操作员将能够移出危险区域。例如,在无故障的条件下,在操作者的手的方向移动的滚子不能陷住它。在所有其他情况下,F1是正确的选择,前提是危险暴露的持续时间不超过机器总操作时间的1/20。需求来源于必要的风险降低。由于这些考虑而降低的PLr在任何情况下都不得低于通过比较方式考虑的机器的PLr,因为并不能从事故发生率低和严重程度低得出实施的安全功能提供的安全水平高于要求。

wdconan001的博客 837

设计模式之TemplateMethod模板方法(高级源码案例)

我是 [闲人球] 这个名字是由我的梦想(闲云野鹤)与外号(球球)组合而成,是一个热爱生活、热爱技术的"橡皮擦girl " 这博客是对自己学习的一丢丢总结及记录,如果您对 Java、算法、架构感兴趣,可以关注我的动态,我们一起学习。 快乐学习,认真生活;心中有爱,眼里有光 TemplateMethod (钩子函数、回调函数就是模板方法这种模式),这种方法其实我们一直在用,如: ClassLoader findClass() HttpServlet doGet() doPost() 凡.

闲人球 364

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.5 RTC设备编写与实现

4. Linux kernel RTC子系统goldfish_rtc driver分析。电脑,会需要时间,还比如 我们的手机、平板,都需要时间;驱动基本就是应用层需要什么数据你给什么数据就行,基本必须实现的就是。3.2 Linux kernel RTC 设备描述符讲解。中看到他的具体实现,也可以根据他的寄存器描述直接在。5. 将驱动添加进kernel和测试RTC驱动。系统来说,时间是一个非常重要的功能;之类的函数接口,接下来我们就开始讲解如何写。,所以我们直接移植设备树即可。,他的寄存器很简单,你可以从。

DSMGUOGUO的博客 570

模板方法设计模式(TemplateMethod)

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

Lifelong learning 945

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

(TemplateMethod)模板方法设计模式

(TemplateMethod)模板方法设计模式 所谓设计模式就是指:所谓模板方法模式是指:“定义一个操作中 的算法的骨架,而将一些步骤延迟到子类中。 Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改 变算法架构的情况下,重新定义算法中的某些步骤 定义一个操作中的算法的骨架,而将步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义某些特定的步骤。 我们

weixin_44435366的博客 286

计算机控制技术及应用

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

设计模式——模板方法(TemplateMethod)

文章目录设计模式一、模板方法的概述二、解决的问题三、代码实例四、应用场景 设计模式 一、模板方法的概述 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类则在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。 二、解决的问题 当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,由子类来实现。 换句话说,在软件开发中实现一个算法...

Clannad191的博客 252

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

设计模式-TemplateMethod模板方法

设计模式-TemplateMethod模板方法什么是模板方法角色优缺点优点缺点适用场景实现创建一个抽象类创建扩展的子类测试 什么是模板方法 ​ 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ​ 使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写); ​ 其实就是JAVA的继承以及抽象方法、重写覆盖的使用; ​ 注意:为防止恶意操作,一般模板方法都加上 fi

m0_46690280的博客 209

大话设计模式——模板方法(TemplateMethod)

宏观导图 细节展示  1、结构图              2、关键代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TemplateMethod_Pattern {

softwareCraftsman 1460

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

设计模式之模板方法模式模板方法模式代码实现模式的应用 模板方法模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 代码实现 package com.cyc.design.template; public class Main {

意田天的博客 1万+

设计模式-模板方法模式(TemplateMethod)

模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体方法:在抽象类中实现算法中不变的部分,这些方法通常是私有的,以避免子类对其进行修改。 抽象方法:在抽象类中声明一些抽象方法,这些方法是为了在子类中实现特定于子类的步骤。 钩子:可以提供一些默认实现的方法,这些方法通常为空或者包含默认逻辑,子类可以选择性地覆盖这些方法。

m0_51176516的博客 1877

Java设计模式之模板方法模式(TemplateMethod)

1. 模板方法模式 1.1 定义 模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。(引自《大话设计模式》) 1.2 基本结构图 1.3 模式理解 从类图中可看出,该模式的核心就是继承。 举个栗子,可以更加直观的理解。比如说,现在有学生a、学生b,现在学习制作蛋糕,制作蛋糕的步骤大致为: ...

zaoan_2010的专栏 313

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

模板方法设计模式是基于抽象方法上的设计模式 主要应用于以下情况: 当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以 把不确定的部分暴露出去,让子类去实现。换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用, 这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽 象出来,供不同子类实现。这就是一种模板模式。 以计算代码运行时间为例 public abstract c...

z710757293的博客 256

设计模式_模板方法模式_TemplateMethod

模板方法模式,又叫模板模式,在一个抽象类中定义了一个执行它的其他方法的公开模板方法,子类可以按需重写抽象类的抽象方法简单说,模板方法模式 定义一个操作中的算法(或者说流程)的骨架,而将一些步骤下放到子类中实现,使得子类可以在不改变算法结构的基础上,可以重新定义算法的某些步骤该模式属于行为型模式通过添加不同的配料,可以制作出不同口味的豆浆制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎,这几个步骤对于制作每种口味的豆浆都是一样的【优点】既统一了算法,也提供了很大的灵活性。

皮球 1638

设计模式入门之模板方法模式TemplateMethod

模板方法模式定义: 定义一个算法的骨架,而将步骤延迟到子类中。这种模式可以使得在不改变算法骨架(模板)的情况下修改每个步骤的具体实现 从功能上来看,这个模式跟生成器模式有些相像,只不过生成器模式定义了创建对象的过程,而模板方法模式定义了算法过程 .接口和抽象类 (1)接口是特殊的抽象类,接口中所有方法必须是抽象的,不能有具体实现;而抽象类中可以有实现的方法 (2)抽象类不一定包含抽象方法,有抽象方法的类一定是抽象类 (3)需要约束子类行为时用接口,既要约束子类行为,又要为其提供公共功能时用抽象类 模板方法模

王俊祥的菜鸟博客 1090

设计模式——模板方法模式(TemplateMethod)

文章目录模板方法设计模式(取餐馆吃饭示例)0. UML结构图1. 取餐馆吃饭示例 Code1.1 模板 - 餐馆抽象类1.2 面食餐馆1.3 海鲜餐馆1.4 火锅餐馆2. 取餐馆吃饭示例 Test 代码:GitHub 模板方法设计模式(取餐馆吃饭示例) 0. UML结构图 1. 取餐馆吃饭示例 Code 1.1 模板 - 餐馆抽象类 public abstract class Re...

蒋含竹的博客 307

设计模式--TemplateMethod(模板方法)

类别:组件协作(晚绑定) 场景:整体结构稳定,但是子步骤有很多改变 模式定义: * 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。 public abstract class AbsClass{ //基本方法 protected abstract void doSomething(); protected abstract.

weixin_34240395的博客 163
上一篇: java基础-抽象类(Abstract)
Mark_XC
博客等级 码龄9年 16粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值