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

【设计模式-模板】

定义

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

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();}
}

优点

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

缺点

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

使用场景

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

相关文章:

【设计模式-模板】

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

小程序原生-列表渲染

1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号&#xff1a;{{index}} - 元素&#xff1a;{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…...

JAVA认识异常

目录 1. 异常的概念与体系结构 1.1 异常的概念 1. 算术异常 2. 数组越界异常 3. 空指针异常 1.2 异常的分类 1. 编译时异常 2. 运行时异常 2.1 异常的处理 防御式编程 2.2 异常的捕获 2.3.1 异常声明throws 2.3.2 try-catch捕获并处理 2.3.3 finally 总结 1. 异常…...

2024年10月计划(工作为主,Ue5独立游戏为辅,)

我发现一点&#xff0c;就是工作很忙&#xff0c;比如中秋也在远程加班&#xff0c;周末有时也远程加班&#xff0c;国庆节甚至也差点去甲方工作。甚至有可能驻场。可见&#xff0c;小公司确实不能去。 好在&#xff0c;9月份时&#xff0c;通过渲染 除了上班时间外&#xff0…...

并发、并行和异步设计

译者个人领悟,一家之言: 并发和并行确实可以明确区分出来,因为cpu的速度非常快,在执行一个任务时经常要等其他组件,比如网络,磁盘等,如果一直串行等待这样就会造成很大的浪费. (就类似于烧水的同时,可以切菜,不用等烧水完成了才去切菜,我可以烧一会水,火生起来了水壶放上了,随…...

求职Leetcode题目(12)

1.只出现一次的数字 异或运算满足交换律 a⊕bb⊕a &#xff0c;即以上运算结果与 nums 的元素顺序无关。代码如下&#xff1a; class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num:nums){ans^num;}return ans;} } 2.只出现一次的数字II 这是今天滴…...

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件&#xff0c;例如 工作流引擎activiti&#xff0c;暂未适配yashandb&#xff0c;使用中会出现如下异常&#xff1a; 问题的风险及影响 …...

Hadoop三大组件之MapReduce(一)

Hadoop之MapReduce 1. MapReduce是什么 MapReduce是一个分布式运算程序的编程框架&#xff0c;旨在帮助用户开发基于Hadoop的数据分析应用。它的核心功能是将用户编写的业务逻辑代码与自带的默认组件整合&#xff0c;形成一个完整的分布式运算程序&#xff0c;并并发运行在一…...

SQL Server 分页查询的学习文章

SQL Server 分页查询的学习文章 一、SQL Server 分页查询1. 什么是分页查询&#xff1f;2. SQL Server 的分页查询方法2.1 使用 OFFSET 和 FETCH NEXT语法&#xff1a;示例&#xff1a; 2.2 使用 ROW_NUMBER() 方法语法&#xff1a;示例&#xff1a; 2.3 性能考虑3. 总结 一、S…...

告别PDF大文件困扰!4款PDF在线压缩工具助你轻松优化!

嘿&#xff0c;档案员小伙伴们&#xff0c;今天咱们来聊聊那些让咱们在档案堆里游刃有余的神器。这些工具啊&#xff0c;简直就是咱们档案员的得力助手&#xff0c;特别是在PDF压缩这块儿&#xff0c;简直就是神器中的神器&#xff01; 1、福昕转换大师 网址&#xff1a;http…...

Find My汽车钥匙|苹果Find My技术与钥匙结合,智能防丢,全球定位

随着科技的发展&#xff0c;传统汽车钥匙向智能车钥匙发展&#xff0c;智能车钥匙是一种采用先进技术打造的汽车钥匙&#xff0c;它通过无线控制技术来实现对车门、后备箱和油箱盖等部件的远程控制。智能车钥匙的出现&#xff0c;不仅提升了汽车的安全性能&#xff0c;同时也让…...

mysql学习教程,从入门到精通,SQL UNION 运算符(27)

1、SQL UNION 运算符 UNION 运算符在 SQL 中用于合并两个或多个 SELECT 语句的结果集&#xff0c;并默认去除重复的行。如果你想要包含所有重复行&#xff0c;可以使用 UNION ALL。下面是一个使用 UNION 运算符的示例&#xff0c;假设我们有两个表&#xff1a;employees_2020 …...

PKCE3-PKCE实现(SpringBoot3.0)

在 Spring Boot 3.0 JDK 17 的环境下&#xff0c;实现 PKCE 认证的核心步骤包括&#xff1a; 1&#xff09;引入依赖&#xff1a;使用 Spring Security OAuth 2.0 客户端进行授权码流程。 2&#xff09;配置 OAuth 2.0 客户端&#xff1a;在 Spring Boot 中配置 OAuth 2.0 客…...

C++详解vector

目录 构造和拷贝构造 赋值运算符重载&#xff1a; vector的编辑函数&#xff1a; assign函数&#xff1a; push_back和pop_back函数&#xff1a; insert函数&#xff1a; erase函数&#xff1a; swap函数&#xff1a; clear函数&#xff1a; begin函数&#xff1a; e…...

Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

Redis作为一个高性能的key-value数据库&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。然而&#xff0c;Redis是基于内存的数据库&#xff0c;这意味着一旦服务器宕机&#xff0c;内存中的数据就会丢失。为了解决这个问题&#xff0c;Redis提供了数据持久化的机制&#…...

World of Warcraft [CLASSIC] Engineering 421-440

工程学421-440 World of Warcraft [CLASSIC] Engineering 335-420_魔兽世界宗师级工程学需要多少点-CSDN博客 【萨隆邪铁锭】421-425 学习新技能&#xff0c;其他都不划算&#xff0c;只能做太阳瞄准镜 【太阳瞄准镜】426、427、428、429 【随身邮箱】430 这个基本要做的&am…...

VUE3.5版本解读

官网&#xff1a;Announcing Vue 3.5 | The Vue Point 2024年9月1日&#xff0c;宣布 Vue 3.5“天元突破&#xff1a;红莲螺岩”发布&#xff01; 反应系统优化 在 3.5 中&#xff0c;Vue 的反应系统经历了另一次重大重构&#xff0c;在行为没有变化的情况下实现了更好的性能…...

spark计算引擎-架构和应用

一Spark 定义&#xff1a;Spark 是一个开源的分布式计算系统&#xff0c;它提供了一个快速且通用的集群计算平台。Spark 被设计用来处理大规模数据集&#xff0c;并且支持多种数据处理任务&#xff0c;包括批处理、交互式查询、机器学习、图形处理和流处理。 核心架构&#x…...

VUE 开发——AJAX学习(二)

一、Bootstrap弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 引入bootstrap.css和bootstrap.js准备弹框标签&#xff0c;确认结构通过自定义属性&#xff0c;控制弹框显示和隐藏 在<head>部分添加&#xff1a…...

机器学习-KNN分类算法

1.1 KNN分类 KNN分类算法&#xff08;K-Nearest-Neighbors Classification&#xff09;&#xff0c;又叫K近邻算法。它是概念极其简单&#xff0c;而效果又很优秀的分类算法。1967年由Cover T和Hart P提出。 KNN分类算法的核心思想&#xff1a;如果一个样本在特征空间中的k个最…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...