【设计模式-模板】

devtools/2024/10/20 14:54:58/

定义

模板方法模式是一种行为设计模式它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。

UML图

在这里插入图片描述

组成角色

  • AbstractClass(抽象类):
    定义模板方法,包含算法的基本框架。它可能包含一些基本实现或抽象方法,供子类实现。
  • ConcreteClass(具体类):
    实现抽象类中的抽象方法,并可能覆盖模板方法中的某些步骤。具体类提供算法的具体实现。
  • templateMethod(模板方法):
    定义算法的骨架,调用各个步骤的方法。

代码

// AbstractClass
abstract class CaffeineBeverage {// 模板方法final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}// 基本方法void boilWater() {System.out.println("Boiling water");}// 抽象方法,子类必须实现abstract void brew();// 基本方法void pourInCup() {System.out.println("Pouring into cup");}// 抽象方法,子类可以选择实现abstract void addCondiments();
}// ConcreteClass1
class Coffee extends CaffeineBeverage {@Overridevoid brew() {System.out.println("Dripping coffee through filter");}@Overridevoid addCondiments() {System.out.println("Adding sugar and milk");}
}// ConcreteClass2
class Tea extends CaffeineBeverage {@Overridevoid brew() {System.out.println("Steeping the tea");}@Overridevoid addCondiments() {System.out.println("Adding lemon");}
}// Client code
public class TemplateMethodDemo {public static void main(String[] args) {CaffeineBeverage coffee = new Coffee();coffee.prepareRecipe();System.out.println();CaffeineBeverage tea = new Tea();tea.prepareRecipe();}
}

优点

  • 代码复用:将算法的公共部分放在抽象类中,提高了代码的复用性。
  • 灵活性:子类可以自由扩展或修改算法的某些部分,而不需要修改整个算法。
  • 清晰性:算法的结构在模板方法中清晰可见,易于理解。

缺点

  • 不灵活:子类必须遵循模板方法定义的算法结构,可能导致不必要的复杂性。
  • 类的数量增加:随着算法的扩展,可能会导致类的数量增加,从而增加管理的复杂性。

使用场景

  • 当有多个子类需要重用相同的算法时。
  • 当需要在不改变算法结构的前提下扩展算法时。
  • 当算法的步骤可以由不同的子类实现,但整体流程是固定的时。

http://www.ppmy.cn/devtools/120214.html

相关文章

Flink从ck拉起任务脚本

#!/bin/bashAPP_NAME"orderTest"CHECKPOINT_BASE_PATH"hdfs:///jobs/flink/checkpoints/aaa-test/"is_running$(yarn application -list | grep -w "$APP_NAME" | grep -c "RUNNING")if [ $is_running -gt 0 ]; thenecho "应用程…

[Linux]开发环境搭建

RPM和YUM 安装JDK 安装Tomcat 安装IDEA 安装MySql

【学习笔记】手写 Tomcat 六

目录 一、线程池 1. 构建线程池的类 2. 创建任务 3. 执行任务 测试 二、URL编码 解决方案 测试 三、如何接收客户端发送的全部信息 解决方案 测试 四、作业 1. 了解工厂模式 2. 了解反射技术 一、线程池 昨天使用了数据库连接池,我们了解了连接池的优…

深度学习:GAN图像生成

GAN的诞生背景 诞生: 2014年由Ian Goodfellow提出 创新性: 无监督学习:GAN 提供了一种新的方法来进行无监督学习,即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练:通过引入对抗机制,G…

鹏哥C语言62---第9次作业:函数递归练习

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> //-------------------------------------------------------------------------------------------第九次作业 函数递归等 //-----------------------------------------------------…

PHP爬虫APP程序:打造智能化数据抓取工具

在信息爆炸的时代&#xff0c;数据的重要性日益凸显。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;因其强大的功能和灵活性&#xff0c;成为开发爬虫程序的理想选择。本文将探讨如何使用PHP构建一个爬虫APP程序&#xff0c;以及其背后的思维逻辑和实现步骤。 什么是PHP爬…

Vulhub zico 2靶机详解

项目地址 https://download.vulnhub.com/zico/zico2.ova实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知Zico 2的一个ip地址为…

Redis篇(最佳实践)(持续更新迭代)

介绍一&#xff1a;键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如&#xff1a; 我们的登录业务&#xff0…