当前位置: 首页 > news >正文

设计模式之-模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景

系列文章目录

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列
设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点
设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。
设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码
设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
设计模式之-中介者模式,快速掌握中介者模式,通俗易懂的讲解中介者模式以及它的使用场景
设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景


文章目录

  • 系列文章目录
  • 前言
  • 一、使用场景通常
  • 二、通过一个故事来更好地理解它
    • 当谈到模板方法模式时,我们可以通过一个故事来更好地理解它。
    • 以下是对应于故事的代码示例:


前言

当谈到模板方法模式时,在面向对象的编程中,它是一种行为设计模式。模板方法模式定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
使用模板方法模式的主要目的是将通用的算法步骤抽象到父类中,然后通过具体的子类来实现这些步骤的具体细节。这样可以避免代码的重复,并且使得算法的结构更加清晰可见。

一、使用场景通常

模板方法模式的使用场景通常是在以下情况下:

当有一个通用的算法结构,但其中的某些步骤的具体实现可能会有所不同时,可以使用模板方法模式。例如,一个建筑公司可能有多个具体的建筑项目,但它们共享相同的施工过程。
当需要在不改变算法结构的情况下,通过子类来扩展或修改某些步骤的实现时,可以使用模板方法模式。

二、通过一个故事来更好地理解它

当谈到模板方法模式时,我们可以通过一个故事来更好地理解它。

假设有一个叫做Tom的人,他是一名音乐家,他每天都有一套固定的音乐表演流程。这个流程包括三个步骤:准备乐器、演奏音乐、道别观众。

Tom为了能够更好地组织自己的表演,决定使用模板方法模式。他创建了一个名为Musician的抽象类,其中定义了一个名为performance的模板方法。

开始:

Tom首先准备乐器,这是表演的第一步。在抽象类Musician中,他定义了一个名为prepareInstrument的抽象方法,他知道这是一个必须由不同的音乐家来具体实现的步骤。

然后:

Tom开始演奏音乐,这是表演的第二步。在抽象类Musician中,他定义了一个名为playMusic的具体方法,这个方法有一个默认的实现,其中包含了一些通用的演奏操作。

最后:

Tom道别观众,这是表演的最后一步。在抽象类Musician中,他定义了一个名为farewellAudience的抽象方法,他知道每个音乐家都有不同的方式来与观众道别。

Tom创建了两个具体的子类:Pianist和Violinist,他们都继承了Musician类。在这两个子类中,他们分别实现了抽象方法prepareInstrument和farewellAudience。

当Tom要进行表演时,他选择具体的子类来实例化,并调用performance方法。这个方法按照抽象类中定义的顺序依次调用了prepareInstrument、playMusic和farewellAudience方法。

通过模板方法模式,Tom可以轻松地组织自己的音乐表演流程,而不必关心每个具体步骤的细节。他可以根据需要选择不同的子类来实现特定的步骤,从而实现了代码的复用和灵活性的提高。

以下是对应于故事的代码示例:

// 抽象类
abstract class Musician {// 模板方法public final void performance() {prepareInstrument();playMusic();farewellAudience();}// 抽象方法,子类必须实现protected abstract void prepareInstrument();// 具体方法,子类可以选择性实现protected void playMusic() {System.out.println("Playing music");}// 抽象方法,子类必须实现protected abstract void farewellAudience();
}// 具体类:钢琴家
class Pianist extends Musician {@Overrideprotected void prepareInstrument() {System.out.println("Preparing piano");}@Overrideprotected void farewellAudience() {System.out.println("Farewell, audience");}
}// 具体类:小提琴家
class Violinist extends Musician {@Overrideprotected void prepareInstrument() {System.out.println("Preparing violin");}@Overrideprotected void farewellAudience() {System.out.println("Farewell, audience");}
}// 客户端代码
public class Main {public static void main(String[] args) {Musician pianist = new Pianist();pianist.performance();Musician violinist = new Violinist();violinist.performance();}
}

在上面的示例中,Musician是一个抽象类,其中定义了一个模板方法performance,这个方法包含了一系列的表演步骤调用。其中,prepareInstrument和farewellAudience是抽象方法,需要在具体的子类中实现;而playMusic是一个具体方法,可以选择性地在子类中实现。

Pianist和Violinist是具体的子类,它们继承了Musician并实现了其中的抽象方法。通过调用performance方法,可以看到具体子类中的实现细节按照抽象类中定义的算法骨架被执行。

这样,通过模板方法模式,Tom可以按照固定的流程进行音乐表演,而不必关心每个具体步骤的细节。他可以根据需要选择不同的子类来实现特定的步骤,从而实现了代码的复用和灵活性的提高。

http://www.lryc.cn/news/265793.html

相关文章:

  • 微软官方出品:GPT大模型编排工具,支持C#、Python等多个语言版本
  • docker安装的php 在cli中使用
  • tcp vegas 为什么好
  • 【设计模式】命令模式
  • Unity头发飘动效果
  • 【MIKE】MIKE河网编辑器操作说明
  • RIPV1配置实验
  • 快速实现农业机械设备远程监控
  • 解决用Fiddler抓包,网页显示你的连接不是专用/私密连接
  • 单片机原理及应用:流水灯的点亮
  • 蓝桥杯宝藏排序算法(冒泡、选择、插入)
  • 使用@jiaminghi/data-view实现一个数据大屏
  • 神经网络:池化层知识点
  • 微服务常见的配置中心简介
  • 银河麒麟v10 rpm安装包 安装mysql 8.35
  • 一篇文章带你搞定CTFMice基本操作
  • Spring security之授权
  • 模式识别与机器学习(十一):Bagging
  • 数据压缩(哈夫曼编码)
  • 移动安全APP--Frida+模拟器,模拟器+burp联动
  • MATLAB遗传算法工具箱的三种使用方法
  • 复习linux——时间同步服务
  • 如何在Linux设置JumpServer实现无公网ip远程访问管理界面
  • 【Git】在 IDEA 中合并多个 commit 为一个
  • 性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程
  • Ai 会替代人类工作吗?
  • 神经网络:深度学习基础
  • 如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问
  • 【Transformer框架代码实现】
  • Apache ShenYu 网关JWT认证绕过漏洞 CVE-2021-37580