模板设计模式

傻白入门芯片设计,芯片键合(Die Bonding)(四) 傻白入门芯片设计,芯片键合(Die Bonding)(四) 引线键合、倒装芯片键合、管脚贴合技术 阅读详情

自我修养之模板设计模式

定义:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

解决什么问题?

主要解决同一接口的不同实现中包含了重复的代码,可抽取公共的代码片段.

如何解决?

将通用的逻辑抽取出来,定义一个抽象方法,由不同的子类去实现不同的逻辑

案例需求:

以热饮料为例:
	盖伦:要喝热咖啡
    提莫:要喝热奶茶

如果不使用模板设计模式

/**
 * @ Author     :kwj.
 * @ Date       :Created in 23:15 2020/3/30 0030
 * @ Description:热茶
 * @ Modified By:
 * 欢迎关注公众号: ProgramLife 定期推送系列文章
 */
public class TeaDrink {

    public static void main(String[] args) {
        //第一步烧热水
        System.out.println("烧热水");
        //第二步将水导入杯子
        System.out.println("倒入杯子");
        //第三步制作咖啡
        System.out.println("制作茶");
    }

}
//热咖啡
public class CoffeeDrink {

    public void markDrink(){
        //第一步烧热水
        System.out.println("烧热水");
        //第二步将水导入杯子
        System.out.println("倒入杯子");
        //第三步制作咖啡
        System.out.println("制作咖啡");
    }
}

经过对比发现:上述两个类唯一不同的区别在于第三步,这刚好满足使用模板设计模式,抽取第一步和第二步为公共逻辑,将第三步进行抽象,交给子类去实现,代码如下:

创建公共接口

public interface HotDrink {
    public void makeHotDrink();
   	/**
     * 添加调料
     */
    public void addCondiments();
}

编写抽象类,抽取公共逻辑

public abstract class AbstractHotDrink implements HotDrink{
    @Override
    public void makeHotDrink() {
        boilWaterAndPour();
        if (customCondiments()) {
            addCondiments();
        }
        makeDrink();
    }
    /**
     * 抽象方法 交给子类实现
     */
    protected abstract void makeDrink();

    /**
     * 即抽取公共逻辑
     * 烧热水+倒入杯子
     */
    public void boilWaterAndPour(){
        //第一步烧热水
        System.out.println("烧热水");
        //第二步将水导入杯子
        System.out.println("倒入杯子");
    }
   /**
     * 钩子函数 默认返回true
     * 即默认都加调料
     * @return
     */
    public boolean customCondiments(){
        return true;
    }

    /**
     * 默认都加糖,可被子类覆盖(目的是为了防止盖伦想加糖,提莫不想加糖想加其他的)
     */
    @Override
    public void addCondiments() {
        System.out.println("加糖");
    }
}

制作咖啡

public class CoffeeDrink extends AbstractHotDrink{
    @Override
    protected void makeDrink() {
        System.out.println("制作咖啡");
    }
    /**
     * 想加果冻
     */
    @Override
    public void addCondiments() {
        System.out.println("加果冻");
    }
    //当然你也可以覆盖customCondiments方法,return false则什么都不加
}

制作热茶

public class TeaDrink extends AbstractHotDrink{
    @Override
    protected void makeDrink() {
        System.out.println("制作茶");
    }
}

测试一波

在这里插入图片描述

钩子能够作为条件来进行控制判断是否要去做某事。通过模板设计模式,后续新增热豆浆、热牛奶等等都非常方便

模板设计模板在SpringSecurity源码中的应用

对于使用过SpringSecurity的小伙伴肯定对UsernamePasswordAuthenticationFilter非常熟悉,在ProviderManager#authenticate()中调用

在这里插入图片描述
然后调用AbstractUserDetailsAuthenticationProvider#authenticate
在这里插入图片描述
在这里插入图片描述
retrieveUser交由子类去实现,这就是一个典型的模板设计模式的体现

总结:

优点:

1、模板方法模式在定义了一组算法,将具体的实现交由子类负责。

2、模板方法模式是一种代码复用的基本技术。

3、模板方法模式导致一种反向的控制结构,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,符合“开闭原则”。

缺点:

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景

1、 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2、 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。

3、控制子类的扩展
注意事项:为防止恶意操作,防止子类改变算法的实现步骤,一般模板方法都加上 final 关键词。

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting) 在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。 阅读详情

相关推荐

傅里叶变换实战:用Python手把手教你分析音频频谱(附完整代码)

本文详细介绍了如何使用Python实现傅里叶变换进行音频频谱分析,涵盖音频加载、预处理、FFT应用、频谱可视化及特征提取等关键步骤。通过实战案例和完整代码,帮助开发者掌握数字信号处理技术,特别适合音频分析和音乐信息检索领域的应用。

weixin_29090677的博客 150

设计模式第15讲——模板模式(Template)

模板模式是一种基于继承实现的设计模式,它是行为型的模式。一、什么是模板模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图5.1 OrderFood——抽象类(Abstract)5.2 具体类(Concrete Class)5.3 testTemplate六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 9108

跨境TRS投资操作指南与系统解决方案

3 点击【申请 TRS 账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS 账户开户申请已提交,后台对已提交的 TRS 开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;2.点击【申请TRS账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS账户开户申请已提交,后台对已提交的TRS开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;4)更广泛的投资选择:相比A股通,TRS可以交易更多的A股标的,提供了更广泛的投资选择。

2401_85487119的博客 2852

设计模式——模板模式

在面向对象程序设计过程中,程序员常常会遇到如下情况:设计一个系统时知道算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如:去医院看病一般都要经历以下流程:挂号、排队、就诊、取药等,其中挂号和排队对每个客户都是一样的,可以在父类中实现,但是就诊和取药是因人而异的。可以延迟到子类中实现。我们把这些规定了流程或格式的实例定义成模板,允许使用者根据自己的需求去更新它。 一、模板模式的基本介绍 1)、模板方法模式(Template Meth.

程序猿进阶 3091

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

请尽可能地详细说明一个VLA项目的立项训练到落地的全流程

一个机器人VLA项目的全流程是一个复杂的系统工程,它深度融合了机器人学 (Robotics)计算机视觉 (CV)和自然语言处理 (NLP)。其核心挑战在于高质量数据的获取和从仿真到现实的有效迁移。与纯粹的软件AI项目相比,它增加了硬件、物理交互和安全性的维度,但其最终能让AI走出虚拟世界、在物理世界中产生实际价值,这也是其巨大的魅力所在。

具身机器人和通用AI 303

模板设计模式_23种设计模式之模板设计模式

基本介绍1.模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的模板。它的子类可以俺需要重写方法实现,但调用将以抽象类中定义的方式进行;2.简单说,模板方法模式定义一个操作中的算法的骨架,而降一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤;3.这些类型的设...

weixin_39579127的博客 4288

g2o&PCL 四阶多项式拟合

g2o&PCL 四阶多项式拟合

dayuhaitang1的博客 140

设计模式-模板模式

我们再学习另外一种行为型设计模式,模板模式。我们多次强调,绝大部分设计模式的原理和实现,都非常简单,难的是掌握应用场景,搞清楚能解决什么问题。模板模式也不例外。模板模式主要是用来解决复用和扩展两个问题。我们今天会结合 Java Servlet、JUnit TestCase、Java InputStream、Java AbstractList 四个例子来具体讲解这两个作用。 模板模式的原理和实现 模板模式,全称是模板方法设计模式,英文是 Template Method Design Pattern。在 GoF

Eistert 2622

手把手教你学Simulink——基于AI融合与智能调度的场实例:强化学习在卫星资源分配中的应用

本文详细介绍了如何利用Simulink和强化学习技术实现智能卫星资源分配。文章首先分析了低轨卫星通信系统面临的动态资源调度挑战,提出采用强化学习(特别是PPO算法)的解决方案。接着逐步展示了完整的建模过程:从Simulink项目创建、卫星通信环境建模(用户业务、信道特性、资源池),到强化学习任务定义(状态空间、动作空间、奖励函数),再到PPO智能体的构建与训练。最后通过仿真验证,PPO智能体在系统吞吐量、公平性和阻塞率等关键指标上均优于传统方法。该方案为卫星通信系统的智能资源管理提供了可行方案,并支持进一步

MHD0815的博客 190

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1063

设计模式---模板模式(DesignPattern_TemplateMethod)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 111

WS2812和homeassistant握手

本文学习了WS2812和homeassistant握手,后期会分享更多有趣物联网的操作从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。...

vor234的博客 811

模板设计模式(Template Design Pattern)

如果说算法,数据结构是编码术的层面,那么设计模式则是编码中的道。 定义 模板设计模式,定义一组算法的框架,这些算法的步骤大致相同。而将这些算法中不同的步骤延迟到子类中实现。 例子 我们在日常生活中使用的料理机时,先将原材料经过初步处理(打豆浆,需要泡豆子;榨果汁,需要提前将水果洗好),然后打开料理机的盖子打开,将原材料放进去,打开料理机开关完成粉碎,然后过滤,得到我们想要的果汁(或豆浆)。将整个...

bajiexu的博客 113

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

模板消息设计模式

设计模式就是解决一些问题时的固定思路,也就是代码设计思路经验的总结。

田埂、の技术博客 413

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

设计模式之模板设计模式

顾名思义,模板设计模式就是将许多公用的常用的代码封装成一个模板,我们只需要实现不同的业务需求的代码,然后和模板组合在一起,那么就得到完整的逻辑。 在我们的日常开发中,常用的模板模式有两种实现方式:继承和接口回调,下面我们就分别使用这两种方式来实现模板设计模式。 假设一个场景:有一段代码如下所示...

chengxuqiu5981的博客 294

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

模板设计模式的两种方式

对于模板设计模式而言,一般有两种方式 1、基于继承的实现 2、基于组合的实现 基于继承实现模板设计: package org.zttc.itat.template; /** * 基于继承实现模板设计模式 * @author Administrator * */ public abstract class MyJdbcTemplateByIn { private void beg...

qiudechao1的博客 2687

C# 面试问题高级:039 - 什么是模板方法设计模式Template Method design pattern?

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的步骤骨架,将这些步骤的具体实现延迟到子类中。这种模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

caifox的博客 1018

设计模式 – 模板设计模式

模板设计模式 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 该模式的主要优点如下。 1) 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。 2) 它在父类中提取了公共的部分代码,便于代码复用。 3) 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的

qq_34125999的博客 2113
上一篇: 多线程join分析
下一篇: 手把手教你搭建博客系统
mastertojava
博客等级 码龄9年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值