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

【异常】Claude Code 在 Windows CMD 中出现重影现象的排查与解决 Windows CMD运行Claude Code时出现文字重影、乱码等问题,原因是传统CMD对现代ANSI终端控制序列支持不足。解决方案包括:1)推荐安装Windows Terminal(完全支持ANSI标准);2)使用PowerShell 7;3)优化CMD设置(启用虚拟终端、UTF-8编码);4)关闭Claude Code视觉特效。建议优先使用Windows Terminal以获得最佳体验,这是最彻底的解决方案。其他方案仅能部分改善或缓解问题。 阅读详情


更多关于设计模式的文章请点击:设计模式之禅(0)-目录页


模板方法模式是23种设计模式中的一种,与其说它是一种设计模式,我更加偏向于认为它是一种设计的思想。

一、模板方法模式的定义

模板方法模式(Template Pattern),一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
在这里插入图片描述

二、模板方法模式的使用

我们又要举动物们的例子了:在动物商店买动物会经过一系列过程:
1、获得动物
2、把动物装起来
3、把动物送给你
这3个步骤可抽取成一个模板方法(Template Method)getAnimals,如以下代码:

public  class AnimalShop {

    //获取动物的模板方法
    public void getAnimals(){
        getAnimal();
        packageAnimal();
        giveAnimal();
    }

   
    public void getAnimal(){//dosomething}

 
    public void packageAnimal(){//dosomething};

     
    public void giveAnimal(){//dosomething};
}

当我们需要有多个不同的动物商店时,我们可以很容易地想到将以上方法抽取出来,使动物商店变成一个超类:

public  abstract class AnimalShop {

    //获取动物的模板方法
    public void getAnimals(){
        getAnimal();
        packageAnimal();
        giveAnimal();
    }

   
    public void getAnimal(){//dosomething}

 
    public void packageAnimal(){//dosomething};

     
    public void giveAnimal(){//dosomething};
}

可是这又有一个问题:子类需要更改模板方法中的两个或三个方法,那应该怎么办呢?

在这里先引出一个概念:方法钩子(Method Hook)
方法钩子可以被理解为在一个超类中默认的方法实现,即子类继承后可自行选择是否去更改它。

所以,我们的动物商店超类可以改写为:

/**
 * @Auther: ARong
 * @Date: 2018/11/30 17:48
 * @Description: 动物商店超类
 */
public abstract class AnimalShop {

    //获取动物的模板方法
    public void getAnimals(){
        getAnimal();
        packageAnimal();
        giveAnimal();
    }

    //getAnimal是钩子方法,可供用户选择是否重写
    public void getAnimal(){
        System.out.println("获得动物");
    }

    //packageAnimal是打包动物抽象方法,由实现类重写
    public abstract void packageAnimal();

    //giveAnimal是打包动物抽象方法,由实现类重写
    public abstract void giveAnimal();
}

这就是一个完备的模板方法模式超类了。接下来我们去继承它:
在这里插入图片描述

  • DogShop
/**
 * @Auther: ARong
 * @Date: 2018/11/30 17:51
 * @Description: 狗狗商店,实现动物商店超类,继承模板方法,重写抽象方法
 */
public class DogShop extends AnimalShop{

    @Override
    public void packageAnimal() {
        System.out.println("将狗狗打包");
    }

    @Override
    public void giveAnimal() {
        System.out.println("将狗狗送出");
    }
}
  • CatShop
/**
 * @Auther: ARong
 * @Date: 2018/11/30 17:54
 * @Description: 小猫商店,实现动物商店超类,继承模板方法,重写抽象方法
 */

public class CatShop extends AnimalShop{


    @Override
    public void getAnimal() {
        //重写钩子方法,修改默认的代码
        System.out.println("重写钩子方法,不要先获得小猫");
    }

    @Override
    public void packageAnimal() {
        System.out.println("将小猫打包");
    }

    @Override
    public void giveAnimal() {
        System.out.println("将小猫送出");
    }
}

  • TestTemplatePattern
/**
 * @Auther: ARong
 * @Date: 2018/11/30 17:56
 * @Description: 模板方法测试
 */
public class TestTemplatePattern {

    @Test
    public void fun1(){
        DogShop dogShop = new DogShop();
        dogShop.getAnimals();
        System.out.println("==================");
        CatShop catShop = new CatShop();
        catShop.getAnimals();
    }
}

测试结果:
在这里插入图片描述

微信小程序 - 最新实现人脸识别认证功能,使用官方微信小程序人脸识别身份验证接口及常见的人脸核验、用户实名认证、身份证件与人脸是否匹配、是否活体、领取业务人脸认证等各种示例(验证活体人脸是否匹配源码) 微信小程序中实现人脸识别认证,微信小程序人脸识别认证-微信开放接口,如何为微信小程序添加人脸识别和身份验证功能,如何为微信小程序集成人脸识别与身份验证,微信人脸识别实名认证集成指南,识别失败,人脸识别接口怎么调用,前后端完整示例代码demo,微信小程序基于小程序实现人脸识别对比,人脸识别报错,微信人脸核身接口能力,微信小程序实名认证 人脸核验 人脸识别,微信小程序实名认证与人脸核身接口全解析,微信小程序-人脸识别+输出人脸匹配信息,微信小程序实名认证人脸核验人脸识别,微信小程序实名认证:wx.startFa 阅读详情

相关推荐

Revit二次开发——不启动Revit,做rvt文件数据导出

Revit二次开发——不启动Revit,做rvt文件数据导出Node.js部分调用C#端供外部调用的dllC#部分调用RevitNet.dll,做数据导出exe做外部调用dll总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 N

Y.Jerome的专栏 4113

《设计模式之禅》-模板方法模式

模板方法 定义: 定义一个 操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 模板方法非常简单,仅仅只是使用了继承机制,但是其应用非常的广泛 abstractClass 中的方法分为两类 1.基本方法 基本方法也叫基本操作,是由子类实现的方法,并在模板方法被调用 2.模板方法 可以有一个或者多个,一般是一个...

Minstrel的博客 293

【机械臂算法】机械臂动力学参数辨识仿真

本文以puma560m机械臂为例子进行动力学参数辨识的讲解,puma560m可以在robotic toolbox中找到,这里以它真实机械臂对他的动力学参数进行辨识。此外这里还有要说的是,机械臂参数辨识其实是一个系统工程,其中和系统的机械、电子、嵌入式都有着很深的联系,并不是仿真这么简单的。

vrijheid的博客 7837

设计模式之行为模式:模板方法(Template Method)

意图 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Methond使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ...

北辰思无邪的博客 330

华为擎云W515 PGUV-WBY0安装银河麒麟V10全流程解析

本文详细解析了华为擎云W515 PGUV-WBY0安装银河麒麟V10系统的全流程,包括准备工作、镜像下载与校验、启动盘制作、BIOS设置、安装过程关键选择、系统初始化及常见问题排查。特别针对ARM架构设备提供了实用技巧,帮助用户顺利完成国产化系统的部署与优化。

weixin_28725949的博客 704

浅谈车载控制器产线EOL实现方式

1、控制器生产产线上电路检测设计 2、客户总装产线检测设计

u012406840的博客 2万+

C语言实现《设计模式之禅》之模板模式

#include #include #include /*C语言实现设计模式之禅  模板模式   类图详见p95*/ #define FALSE  0 #define TRUE   1 typedef int BOOLEAN; /*抽象模板类*/ typedef struct _HummerModel HummerModel; str

chengrile的专栏 727

华为OD机试 - 压缩日志查询(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。某设备需要记录每分钟检测到的指标值。为了节约存储空间,将连续相同指标值的记录合并。压缩之前:202411231000,11 202411231001,11 202411231002,12 202411231003,12 202411231004,

学Java,找哪吒 1880

设计模式-模板方法模式Template Method(对象行为型)

一、概述 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 AbstractClass叫做抽象模板,它的方法分为两类: (1)原始方法,是由子类实现的方法,并且在模板方法被调用 (2)模板方法,可以有一个或几个,实现对原始方法的调度,完成固定的逻辑 class AbstractClass { public: ...

justkong的博客 374

Spring AI提示词模板应用

本文介绍了使用SpringAI提示词模板的配置方法,主要步骤包括:1)在JDK17和SpringBoot3.4.4环境下引入spring-ai-alibaba1.0.0.2依赖;2)配置application.yml文件;3)创建测试控制器类处理提示词模板(.st文件);4)通过模板变量动态生成AI回复内容。演示了如何通过@RequestParam设置默认参数,实现无需前端传参即可测试AI回复功能,最终完成了一个SpringAI提示词模板的应用Demo。

wjianwei666的专栏 201

Linux ARM平台开发系列讲解(GMSL摄像头篇)1.2 MAX9296 GMSL链路配置

串行器 +解串器组成,软件需要做的就是写这三部分的驱动,让摄像头数据能到达。3. 配置解串器和串行器的GMSL链路。串行器和解串器上电成功之后,就可以配置。软件配置(注意软件只可以配置速率,2. 9296上电,使能芯片。的版本和速率,比如版本是配置。配置成功之后,就会出现串行器。的链路,其它同类型的。设备地址,我设置的是。...

DSMGUOGUO的博客 1万+

设计模式之禅【工厂模式】

真刀实枪之工厂方法模式 从女娲造人开始说起 东汉《风俗通》记录了这样一则神话故事:“开天辟地,未有人民,女娲抟黄土做人。”开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹而洁净的自然环境,寂静而又寂寞,于是女娲决定创造一个新物种,即人类来增加世界的繁荣。 别忘了女娲是神仙,没有办不到的事情,造人的过程是这样的:首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放到大

菜鸟零号 kungfu~peng 551

【声纳与人工智能融合——从理论前沿到自主系统实战】第一章 声纳AI的数据基础:仿真、数据集与表征学习

该数据集的特点是包含了多种底质背景(沙地、泥地、碎石区)与噪声条件,适合验证模型的背景抑制能力。Urashima数据集由日本海洋研究开发机构(JAMSTEC)发布,基于自主水下航行器(AUV)采集,包含前视声纳序列数据,主要用于水下导航与避障算法评估,其数据包含了精确的姿态与深度标注,支持三维场景重建算法的训练。北约海洋研究与实验中心(CMRE)发布的CMRE datasets包含侧扫与合成孔径声纳数据,特别适用于跨传感器域自适应研究,数据集中包含了同一区域的多种声纳成像结果,为跨模态学习提供了基准。

u012133341的博客 103

Head First 设计模式 Design Pattern 7-8 Adapter & Facade, Template Method

Section 7 适配器模式和外观模式 Adapter & Facade >客户使用适配器 Client - Request -> Adapter -> TranslateRequest - Adaptee  客户通过目标接口调用适配器的方法发出请求; 适配器使用被适配者的接口把请求转换成被适配者的一个或多个调用接口; 客户收到调用结果, 并不知道是适配器在转化请求 >双向

Fix it 1684

ssm框架搭建

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

精雕软件(JDpaint) 5.5 绿色版

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

java中23种设计模式之7-模板方法模式(template method pattern)

定义:模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。 以生产手机为例,有一个6寸屏幕手机的模型,其他的手机可以用此模型做衍生品。 在这里,6寸屏幕(screenSize)是固定的,不用重写。而手机...

weixin_34306446的博客 87

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python设计模式【7】-模板方法模式

了解模板方法设计模式 模板方法模式适用于以下场景: 1、当多个算法或类实现类似或相同逻辑的时候 2、在子类中实现算法有助于减少重复代码的时候 3、可以让子类利用覆盖实现行为来定义多个算法的时候 模板方法模式的主要意图: 1、使用基本操作定义算法的框架; 2、重新定义子类的某些操作,而无需修改算法的结构; 3、实现代码重用并避免重复工作 4、利用通用接口或实现 模板方法模式使用以下术语——AbstractClass、ConcreteClass、TemplateMethod和Client;

Rnan_prince的博客 531

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

模板方法模式 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 这个模式就显得特别简单了。 就举个例子吧,在我们考试的时候,除了我们给出的答案可能不相同外,试卷其他地方其实是完全相同的,那么我们就要思考如何把试卷相同的地方进行复用。就把试卷相同的部分看作相同逻辑的代码,把我们的答案看成代码之中的不同。 我们首先就会想到继承,但是如何很好的进行继承呢? 我们要完成某一细节层次一直的一个过程或一系列步骤,但其个别步骤在

m0_55759099的博客 157

设计模式7:模板方法模式

一、我的描述   模板方法模式是将不变的行为搬到超类中,去除子类中重复的代码来体现它的优势,提供了很好的代码复用。   我的理解就是就像是咱们学画画的时候,老师说大家比着这个苹果,然后画一幅自己的苹果,然后大家都在那画,但是大家画出来的都不相同,但是呢我们相同的是我们比照的模式是相同的苹果。   再举个例子:某一次考试,同样的试卷,A得到90分,B得到80分。这次考试相同的是:A和...

bacanpi5506的博客 102

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook

模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。 1.CoffeineBeverageWithHook {《HeadFirst设计模式》之模板方法模式 } { 编译工具: Delphi7.0 } { E-Mail : xshlife@163.com } unit uCoffeineBeve

djCode 734

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

1、定义 模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。 2、UML类图 从模型图来看,模板方法模式很简单,但是很常用。抽象模板(AbstractClass)中的方法基本分两类: 基本方法:子类去实现的方法 ,并且在模板方法中被调用。 模板方法:把基本操作方法组合在一起形成一个总算法或一个总行为的方法;一个抽象类可以有任意多个模板

qq_43605227的博客 192

javascript 设计模式(7) —— 模板方法模式

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

Judy1623 189

设计模式7:模板方法模式

有时候,我们需要定义某个方法,这个方法在高层次来看是相同的,但是里面几个具体步骤有可能有些不同。 一种实现方法是父类定义一个虚方法,由多个子类具体实现。但是这样做的话,不变的和可变的行为在子类中是混合在一起的,造成代码的大量重复。 这时候我们需要使用模板方法模式。 模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义算法的某些...

weixin_30457465的博客 144

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

模板方法模式 定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 角色扮演 具体子类(RealClass) 由子类实现的方法,并且在模板方法中被调用 抽象模板类(AbstranctClass) 是一个或者多个,一般是一个具体方法/框架,实现对基本方法的调度,来完成固定的业务逻辑 举例说明 现在某明星要开一场演唱会,那...

更与何人说♫ 203

【设计模式】7. 模板方法模式 -封装算法

引子 例如有两个处理逻辑:泡茶、冲咖啡; 他们的基本流程(算法)是相同的:煮开水、冲泡、倒进杯子、加入调料。只不过具体到个别步骤可能有差异。 如果分成两个类来实现,就会存在重复代码。 ——可以将公共的部分(算法)提到父类中;由各个子类实现每个具体步骤。 定义 Define the skeleton of an algorithm in an operation, def

Alpha's 学习笔记 1588

Head First 设计模式笔记 7.模板方法模式

我们之前封装了对象创建,方法调用,复杂接口,鸭子,这一次,我们要封装算法块。 咖啡与茶 在设计中,我们常常会遇到一些方法通用,另外一些方法却不一样的情况。例如现在咖啡店中,茶和咖啡的冲法非常相似。我们看看。 步骤 咖啡冲泡法 茶冲泡法 1 水煮沸 boilWater() 水煮沸 boilWater() 2 沸水冲泡咖啡 brewCoffeeGrinds() 沸水浸泡茶叶 steepTeaBag() 3 咖啡入杯 pourInCup() 茶入杯 pourInCup() 4 加糖和牛

zhazha_hui的博客 181

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

在微软的WebCast上,李建中老师有个设计模式的系列讲座,其中在讲到模板方法(Template Method)曾说:如果你只想学习一种设计模式就学习模板方法吧。由此可见它使用的广泛性。 今天咱们就来一起学习模板方法模式。   那么,什么是模板方法模式呢?在解决这个问题前,咱们先来看看模板。提到模板,相信大家马上能够想到一些东西,如ppt的模板,报表导出的excel模板,简历的模板等等,呵呵,

wangdeyi1987的专栏 338

7.设计模式-模板方法模式

模板方法模式应用场景?当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

hehao1999的博客 278
上一篇: 设计模式(6)-单例模式
下一篇: 设计模式(8)-迭代器模式
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值