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

设计模式详解---模板方法模式

1. 模板方式概念

当需要定义一个算法的框架,但允许具体步骤在子类中灵活实现时,可以使用模板方法(Template Method)设计模式。该模式通过定义一个模板方法以及一组抽象方法,将算法的结构固定,但具体实现延迟到子类中。

2.实现代码

以下是一个详细示例代码,展示了模板方法设计模式的应用:

// 抽象类
abstract class AbstractClass {// 模板方法,定义了算法的框架public final void templateMethod() {step1();step2();step3();}// 抽象方法,由子类实现具体步骤protected abstract void step1();// 抽象方法,由子类实现具体步骤protected abstract void step2();// 具体方法,通用的步骤protected void step3() {System.out.println("AbstractClass: Performing step 3");}
}// 具体类1
class ConcreteClass1 extends AbstractClass {@Overrideprotected void step1() {System.out.println("ConcreteClass1: Performing step 1");}@Overrideprotected void step2() {System.out.println("ConcreteClass1: Performing step 2");}
}// 具体类2
class ConcreteClass2 extends AbstractClass {@Overrideprotected void step1() {System.out.println("ConcreteClass2: Performing step 1");}@Overrideprotected void step2() {System.out.println("ConcreteClass2: Performing step 2");}@Overrideprotected void step3() {System.out.println("ConcreteClass2: Performing step 3");}
}// 客户端代码
public class Main {public static void main(String[] args) {AbstractClass class1 = new ConcreteClass1();class1.templateMethod();System.out.println("------------------");AbstractClass class2 = new ConcreteClass2();class2.templateMethod();}
}

在上述代码中,抽象类 AbstractClass 定义了一个模板方法 templateMethod(),它规定了算法的框架,并定义了一组抽象方法 step1() 和 step2(),用于具体步骤的实现。step3() 是一个具体方法,提供了一个通用的步骤,但也可以在具体子类中进行重写。

ConcreteClass1 和 ConcreteClass2 是具体类,它们继承自 AbstractClass 并实现了抽象方法。每个具体类根据自身需要,实现了特定的步骤。通过调用 templateMethod() 方法,可以按照算法框架执行具体的步骤。

3. 模板方法模式的优点

1.提供了一个算法框架,将通用的步骤封装在抽象类中,避免了代码重复。
2.具体的步骤由子类实现,使得算法的实现可以灵活变化。
3. 提供了一种扩展的机制,可以在不改变算法结构的情况下,增加新的子类来改变具体的实现。

4.实际应用

模板方法模式在许多框架和库中得到广泛应用,例如在 Java 中,常见的应用场景包括模板方法模式在 Servlet 中的应用,以及 JUnit 测试框架中的测试生命周期。

相关文章:

  • Python爬虫之两种urlencode编码发起post请求方式
  • Qt-QTransform介绍与使用
  • 机器学习算法---回归
  • Linux Java Jar Shell 脚本
  • 使用 React 实现自定义数据展示日历组件
  • 《Linux C编程实战》笔记:进程操作之退出,执行,等待
  • SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?
  • 基于点云去滤除灰尘的滤波算法调研
  • nlp与cv的发展
  • OpenCV技术应用(7)— 将图像转为热力图
  • 用23种设计模式打造一个cocos creator的游戏框架----(二十)解析器模式
  • 【LeetCode刷题笔记】155.最小栈
  • 减速机振动相关标准 - 笔记
  • 鸿蒙HarmonyOS开发用什么语言
  • Python之PyCharm开发工具的安装与设置
  • 230. Kth Smallest Element in a BST
  • ECMAScript6(0):ES6简明参考手册
  • storm drpc实例
  • Vim Clutch | 面向脚踏板编程……
  • 闭包--闭包之tab栏切换(四)
  • 动态魔术使用DBMS_SQL
  • 检测对象或数组
  • 那些年我们用过的显示性能指标
  • 如何优雅地使用 Sublime Text
  • 设计模式(12)迭代器模式(讲解+应用)
  • 什么软件可以剪辑音乐?
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $().each和$.each的区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (6)添加vue-cookie
  • (C++20) consteval立即函数
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (function(){})()的分步解析
  • (二)PySpark3:SparkSQL编程
  • (六)激光线扫描-三维重建
  • (强烈推荐)移动端音视频从零到上手(下)
  • (转)JAVA中的堆栈
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转载)hibernate缓存
  • .chm格式文件如何阅读
  • .net Application的目录
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET企业级应用架构设计系列之技术选型
  • @PreAuthorize注解
  • @开发者,一文搞懂什么是 C# 计时器!
  • [383] 赎金信 js
  • [android学习笔记]学习jni编程
  • [Angular 基础] - 数据绑定(databinding)