设计模式——模板方法模式( Template Method Pattern)

光学测量仿真软件:OpticsBuilder_(9).热应力分析与补偿 在OpticsBuilder中,定义材料的热膨胀系数可以通过API进行。以下是一个Python代码示例,展示如何在OpticsBuilder中定义材料的热膨胀系数。 阅读详情

一、模板方法模式的定义

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

从定义可以看出,模板方法的本质是:封装算法。

类图结构:
这里写图片描述

其中,templateMethod会调用抽象类中定义的一些抽象方法,或者已经实现(默认的具体实现)的方法(称之为“钩子”),子类(实现类)需要实现父类中的抽象方法,或者覆盖父类中已实现的方法,从而实现算法(或改变算法)。

二、一个例子

/**
 * 抽象类,定义了模板方法。
 */
public abstract class AbstractClass {
    // 定义为final:子类不可改变该算法,只能
    // 修改其中的某些步骤的具体实现。
    public final void templateMethod() {
        // 抽象方法,子类必须实现
        primitiveOperation1();
        // 抽象方法,子类必须实现
        primitiveOperation2();
        // 钩子方法,子类可选择覆写或不覆写
        concreteOperation();
    }

    public abstract void primitiveOperation1();
    public abstract void primitiveOperation2();

    // 默认实现了该方法(钩子方法),子类可选择
    // 覆写该方法以改变该步骤,或选择不覆写。
    public void concreteOperation() {
        System.out.println("concreteOperation in abstractClass...");
    }
}

/**
 * 子类,完成算法的具体实现。
 */
 public class ConcreteClass extends AbstractClass {
    public void primitiveOperation1() {
        System.out.println("operation1 in ConcreteClass...");
    }

    public void primitiveOperation1() {
        System.out.println("operation2 in ConcreteClass...");
    }

    /**
     * 子类选择覆写该方法,那么当执行父类中的算法时,会
     * 使用子类中的concreteOperation实现,而不是父
     * 类中的实现。
     */
    public void concreteOperation() {
        System.out.println("concreteOperation in ConcreteClass...");
    }
}

/**
 * 测试类
 */
 public class TemplateMethodTest {
    public static void main(Stirng[] args) {
        ConcreteClass conClass = new ConcreteClass();
        conClass.templateMethod();
    }
}

钩子: 钩子声明在抽象类中,有默认的实现。钩子让子类能够选择对算法的不同点进行挂钩,或者不挂钩。

三、几个问题

1.什么时候选择使用抽象方法?什么时候又该使用钩子?

当子“必须”实现模板算法中的某些步骤时,使用抽象方法;当模板算法中的某个步骤为可选,即子类可以视情况决定是否重现实现(或改变)该步骤时,就使用“钩子”。

2.钩子的作用?

主要有两方面作用:一是可以让子类可选择性地实现算法中的某些步骤;二是让子类可以在算法的某个步骤即将发生之前(或之后)做出一些反应,比如可以在执行父类实现的方法之前(或之后)加入一些代码。

四、好莱坞原则

模板方法模式涉及到面向对象编程中的一条“原则”——好莱坞原则:

别调用我们,我们会调用你。

即,底层组件(子类)可以将自己挂钩到系统上,但高层组件(父类)会决定如何使用这些底层组件(因为父类定义了模板方法,而子类只是实现模板方法中的某些步骤)。因此,高层组件对底层组件的方式就是:你别调用我,我会主动调用你!

五、模板方法模式的优缺点

优点
  • 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
  • 子类实现算法的某些细节,有助于算法的扩展。
  • 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
  • 每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大。
  • 超类中的模板方法中,步骤粒度的划分比较困难:小了会加大子类的负担,大了会降低灵活性。

六、应用场景

  • 比如在棋牌类游戏平台中,玩家登录游戏、进入大厅、选择游戏、进入游戏牌局、开始牌局…这些步骤都是固定的,因此可以使用模板方法模式。
  • java中的sort排序算法。
  • java中的Applet中提供了非常多的“钩子”。
  • 总体来说,模板方法模式适应与那些算法步骤固定,可根据不同的需求,定制算法实现细节的场景。
成对使用离轴抛物面反射镜的设计 阅读详情

相关推荐

【浙大翁恺】C语言习题

/* 02-0. 整数四则运算(10) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。 题目保证输入和输出全部整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 2 输出样例: 3 + 2 = 5 3 - 2 = 1 3 * 2 = 6 3 / 2 =.

qq_43600867的博客 5853

模板方法模式

模板方法模式 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤 将主要的方法定义为final,防止子类修改算法骨架,将子类必须实现的方法定义为abstract。而普通的方法(无final或abstract修饰)则称之为钩子。 钩子作用: 1)作为可选内容,子类可以重写或者置之不理 2)让子类有机会对模板

lansuiyun的专栏 5547

TC3XX - MCAL知识点(三十九):AURIX™ TC3xx 的EDSADC实现旋变解码功能(应用笔记记录)

本文总结了英飞凌应用笔记中关于EDSADC旋变解码系统的关键内容。系统通过调幅解调获取电机位置和速度信号,支持内外载波生成方案,其中内部载波方案更常用(需2个DSADC通道)。重点介绍了滤波器链配置建议(避免FIR1)、系统条件要求(如偶数积分周期)以及群延迟计算方法。特别分析了SDCAP功能对硬件延迟的补偿机制,指出温度等因素可能导致外部电路延迟变化,需通过计数器测量并通过软件调整积分器起始点来消除角度误差。文中还提供了不同硬件延迟情况下的信号处理示例。

梦想技术家 457

《HeadFirst设计模式》第八章-模板方法模式

1.声明 设计模式中的设计思想、图片和部分代码参考自《Head First设计模式》,作者Eric Freeman & Elisabeth Freeman & Kathy Siezza & Bert Bates。 在这里我只是对这本书进行学习阅读,并向大家分享一些心得体会。 2. 需求 我们知道,在我们没有精神的时候,如果能来杯咖啡或者茶那么感觉身体又瞬间充满了活力...

qq_32293345的博客 329

AgentScope实战训练营:从零搭建一个完整的A2A Agent应用

2024年4月,Google在Google Cloud Next大会上正式提出了A2A(Agent-to-Agent)协议,这是一个开放协议,旨在让不同的AI Agent之间能够像微服务一样相互发现、相互调用。通俗地讲:A2A协议就是AI Agent世界的HTTP协议——有了它,一个Agent可以把自己的能力以标准化的方式暴露出去,另一个Agent可以无缝地发现并调用它。本文将基于阿里巴巴开源的(Apache 2.0协议),手把手带你从零搭建一个完整的A2A Agent应用。

program哲学 563

滑块逆向及流程分析

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

pyzzd的博客 8005

模板方法模式(Template Method)

1. 定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2. UML类图 模板方法模式的UML类图很简单,就是一个抽象实现和一个具体实现类的继承关系,也是最简单的行为性设计模式。 AbstractClass: 抽象模板方法templeteMethod定义了模板方法的使用流程,可以包含非抽象方法和抽象方法,所以只能是抽象类,而不能是接口。 ConcreteClass: 具体实现类,模板方法的一种具体实现,根据模板

bluerheaven的博客 408

cefshap(C#)定义浏览器的右键菜单

菜单效果:复制(自带),搜索文本,打开链接,复制链接,刷新,检查,关于 public class MenuHandler : IContextMenuHandler { //public event Action<string> PopupRequest; void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrows

无线智能模块 可视DIY智能专家 1704

封装算法: 模板方法(Template Method)模式

template method(模板方法)模式是一种行为型设计模式,它在一个方法中定义了算法的骨架(这个方法被称为template method,模板方法),并将算法的具体步骤放到具体的子类中去实现。template method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。需要指出的是,这里所说的template并不是c++中的模板。适用性算法的骨架事先已确定,只是算法的某些步骤

Leo的博客 2667

PyTorch实战(21)——扩散模型(Diffusion Model)

扩散模型通过简单的噪声扩散过程,就能创造出高质量的超现实图像。在本节中,我们首先学习了扩散如何用于图像生成,了解了扩散模型的内部运作机制。随后基于动漫图像数据集,使用 PyTorch 和 Hugging Face 框架训练和运行自定义扩散模型,生成逼真动漫图像。

盼小辉丶的博客 3345

ceph recovery 相关参数

可以修改的最大回填/恢复选项列在 “恢复/回填选项” 部分。mClock 的修改 默认回填/恢复限制由 osd_mclock_override_recovery_settings 选项,设置为 默认为 false。尝试修改任何默认恢复/回填限制而不设置门控选项,会将该选项重置为 mClock 默认值,并在集群日志中记录一条警告消息。请注意,默认值可能需要几秒钟才能恢复生效。请使用 config show 命令验证限制,如下所示。就直接设置以下参数,过一会就变回了默认值。简单点说官网的意思就是不设置。

weixin_40548182的博客 278

模板方法模式(TemplateMethod)

模板方法模式(TemplateMethod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 UML类图: TemplateClass是抽象类,其实也就是一个抽象模板,定义并实现一个模板方法,这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实...

指尖飞舞 403

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

J。 2339

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

Java设计模式、模板方法模式、Template Method Pattern

scorpio的博客 3万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

设计模式-模板方法模式-Template Method Pattern

首先,我们定义一个模板基类,其中包含模板方法和一些虚函数,这些虚函数将在派生类中被重写。// 模板基类public:// 模板方法step1();step2();step3();protected:// 抽象步骤,子类必须实现创建一个抽象基类,它定义了模板方法和算法的框架。模板方法:一个或多个步骤组成的算法,这些步骤通过调用抽象操作来执行。抽象操作:定义为纯虚函数(pure virtual functions),子类必须实现这些函数。

wesigj的博客 1289

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式教程:模板方法模式(Template Method Pattern)

定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。通过模板方法,子类可以重新定义算法中的某些步骤,而无需改变算法的结构。

遇见伯灵说的博客 1378

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

模板方法模式通过定义一个算法的骨架,允许子类在不改变算法结构的前提下,通过重写某些步骤的具体实现来定制算法的行为。这种模式提高了代码的复用性和可维护性,使得算法的结构更加清晰,同时也便于扩展和维护。在C++中,模板方法模式是一种非常实用的设计模式,通过它我们可以构建出灵活且易于扩展的软件系统。

J^T的博客 1037

设计模式之模板方法模式(Template Method Pattern)

文章目录一、模板方法模式的定义与特点1.1、定义:1.2、优点:1.3、缺点:二、模式的结构与实现三、家庭制作牛奶的示例3.1、制作牛奶的UML类图3.2、代码3.2.1、Milk(抽象类,表示牛奶)3.2.2、MilkWithRedBean(红豆味的牛奶)3.2.3、MilkWithPeanut(花生的牛奶)3.2.4、MilkWithPure(纯味的牛奶)3.2.5、Client 一、模板方法...

猎人在吃肉 766

23种设计模式之模板方法模式(Template Method Pattern)

假设我们要实现一个对一个数组进行排序的程序,我们可以定义一个抽象类 ArraySorter,其中包含一个模板方法 sort,这个方法包含以下步骤:检查数组是否为空、确定排序算法、调用具体的排序算法。在模板方法模式中,我们通常会定义一个抽象类,它包含了一个模板方法和一些抽象方法,这些抽象方法通常由子类来实现。这样,就可以将算法的公共部分放在抽象类中实现,避免了大量的重复代码,并且能够根据需要灵活地选择不同的排序算法。💕欢迎大家:这里是优快云,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘。

小威的博客 1万+

秒懂设计模式之模板方法模式(Template Method Pattern)

版权申明】非商业目的可自由转载 博文地址: 出自:shusheng007 设计模式系列文章: 秒懂Java代理与动态代理模式 秒懂设计模式之建造者模式(Builder Pattern) 秒懂设计模式之工厂方法模式(Factory Method Pattern) 秒懂设计模式之抽象工厂模式(Abstract Factory Pattern) 秒懂设计模式之策略模式(Strategy Patter...

ShuSheng007的程序人生 2046

设计模式:模板方法模式(Template Method Pattern)

模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。

TechNomad的博客 1227

设计模式-20模板方法模式Template Method Pattern

模板方法模式是一种行为设计模式,它定义算法框架,将可变步骤延迟到子类实现。该模式通过抽象类定义算法骨架(模板方法),其中包含固定步骤和抽象/钩子方法。子类重写这些方法以改变特定步骤,而不修改算法结构。适用于有相同流程但部分步骤不同的场景,如数据处理、文档生成等。优点包括避免代码重复、提高复用性、便于扩展,但可能增加系统复杂度。典型实现包含抽象类定义模板方法和步骤,具体子类实现可变部分。

d3y1`5 81_09 814

设计模式 -- 模板方法模式(Template Method Pattern)

定义一个操作的算法框架,而将具体实现延迟到子类中进行,使得子类在不改变整体算法框架的基础上,可以自定义算法实现。 应用场景 多个子类有公有的方法,并且逻辑基本相同时。 重要复杂的算法可以把核心算法设计为模板方法,具体细节则由子类实现 重构代码时,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。 ① 模板方法:定义了算法的骨架,按某种顺序调用其包

魔法师之家 897

Php设计模式之【模板方法模式Template Method Pattern 】

【案例:确定玩具的购买价格 】 黑枣玩具公司的产品五花八门,不同的产品价格计算方式也不一样。所以对价格计算系统的要求非常高。价格因素主要包括以下几点。 1. 不同的产品有不同的增值税ValueAddTax、关税TariffTax 2. 还有一些玩具需要交其它的税类。如果是塑料玩具,还可能要缴纳环境污染税,其它税还有印花税、资源等,统称为OtherTax 这些费用最终会加入最后的购买价格

MMMMM 1382

设计模式精讲 Day 22:模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的框架,并在该框架中调用一些抽象方法或钩子方法,由子类来实现这些方法。这样,算法的结构保持不变,但具体的实现可以由不同的子类进行定制。模板方法模式的核心思想是将算法的骨架定义在父类中,将具体步骤延迟到子类中实现。通过模板方法,可以统一算法的执行流程,同时允许子类灵活调整部分步骤。模板方法模式适用于具有固定流程但部分步骤需定制的场景。通过完整 Java 示例,展示了模板方法模式的实现方式和实际应用。

在未来等你的专栏 1396

设计模式中的模板方法模式(Template Method Pattern)

在软件开发中,经常会遇到多个类具有相似的逻辑流程,但其中某些步骤可能有所不同。例如,数据处理流程、游戏 AI 决策、网页渲染、文档格式转换等。如果在每个子类中都重复实现相似的逻辑,不仅**代码冗余**,而且**难以维护**。**模板方法模式(Template Method Pattern)** 提供了一种**定义算法骨架,并允许子类实现特定步骤的方法,从而实现代码复用、行为可扩展的设计。本文将详细介绍模板方法模式的概念、应用场景,并通过 Python 代码示例展示其实现方式。

969
上一篇: 设计模式——外观模式(Facade Pattern)
下一篇: clojure实战——IO(1)
蜗牛lz
博客等级 码龄15年 17粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值