3.10设计模式——Template Method 模版方法模式(行为型)

意图

定义一个操作中的算法骨架,而将一些步骤延迟到子类中,Template Method 使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

结构

  • AbstractClass(抽象类)定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各个步骤;实现模版方法,定一个算法的骨架,该模版方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
  • ConcreteClass(具体类)实现原语操作以完成算法中与特定子类相关的步骤。

适用性

  • 一次性实现一个算法不变的部分,并将可变的行为留给子类来实现
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
  • 控制子类扩展。模版方法旨在特定点调用“hook”操作(默认的行为,子类可在必要时进行重定义扩展),这就只允许在这些点进行扩展。

代码示例

// 抽象类 AbstractClass
abstract class AbstractClass {// 模板方法,定义算法的骨架public void templateMethod() {// 调用具体的原语操作operation1();// 调用定义在 AbstractClass 中的操作operation2();// 允许具体子类重定义的钩子操作if (hookMethod()) {operation3();}}// 原语操作1protected abstract void operation1();// 原语操作2protected void operation2() {System.out.println("AbstractClass 中的操作2");}// 钩子操作,具体子类可以选择性实现protected boolean hookMethod() {return true;}// 钩子操作的具体实现protected void operation3() {System.out.println("AbstractClass 中的操作3");}
}// 具体类 ConcreteClass
class ConcreteClass extends AbstractClass {@Overrideprotected void operation1() {System.out.println("ConcreteClass 中的操作1");}@Overrideprotected void operation3() {System.out.println("ConcreteClass 中的操作3");}@Overrideprotected boolean hookMethod() {return false;}
}// 主类
public class Main {public static void main(String[] args) {AbstractClass abstractClass = new ConcreteClass();abstractClass.templateMethod();}
}

AbstractClass 是一个抽象类,它定义了模板方法 templateMethod,其中包含了算法的骨架。AbstractClass 中包含了原语操作1、操作2以及钩子操作。ConcreteClass 是 AbstractClass 的具体子类,它重定义了原语操作1和操作3,并选择性地实现了钩子操作。在 main 方法中,创建了一个 ConcreteClass 实例,并调用了 templateMethod 方法来执行算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幼猫粮适合几个月的猫?

关于幼猫粮的选择,你是否有过疑惑呢?幼猫粮适合几个月的猫呢?今天,就让我来为大家详细解答这个问题吧!🐾 首先,我们要明确一点,幼猫粮是为4-12个月大的小猫咪特别设计的。在这个阶段…

[Java EE] 多线程(六):线程池与定时器

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

功能描述如何逻辑

assign相当于连线,注意每个assign独立,如果有变化立刻变化

CSS选择器、字体文本属性、三大特性、盒子模型等

目录 导入css简介HTML的局限性CSS-网页美化CSS语法规范CSS代码风格 选择器基础选择器复合选择器 CSS字体属性字体系列字体大小字体粗细文字样式字体复合属性 CSS文本属性文本颜色对齐文本装饰文本文本缩进行间距(即行高) CSS的引入方式emmet语法元素显示模式什么是?…

python:dict(字典、映射)使用解析

列表使用:[] 元组使用:() 字符串使用:"" 集合使用:{} 字典:{key:value} 生活中的字典:记录大量的字与含义; python中的字典:通过key去找到对应的value;[key]:value …

Vue 工程化开发入门

Vue开发的两种方式: 核心包传统开发模式:基于html/css/js文件,直接引入核心包,开发Vue工程化开发模式:基于构建工具的环境中开发Vue 这里选择Vue cli脚手架 进行开发,搜索教程自行下载。 组件化开发 一个页…

STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号,以满足采样的需求。(资料参考于正点原子) STM32 拥有 1~3 个 ADC ( STM32F101/102 系列只有 1 个 ADC ),这些 ADC 可以独立使用&#…

苍穹外卖,接入redis cache后,新增套餐有问题

终端报错: java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public com.sky.result.Result com.sky.controller.admin.SetmealController.save(com.sky.d…

虚拟机网络实现桥接模式

虚拟机网络实现桥接模式 虚拟化软件:VMware 17 Linux:rocky8_9 主机:Win10 文章目录 虚拟机网络实现桥接模式1. 桥接模式介绍2. 查看Win本机的网络信息(以笔记本电脑以WiFi联网为例&#x…

保姆级教程申请地理位置接口都给我去试

小程序地理位置接口有什么功能? 目前小程序的地理位置接口已经调整为审核制了,也就是说我们开发者如果小程序需要用到getlocation等接口的话,需要先在小程序后台进行开通申请,提交相关证明材料才可以获得接口使用权限。 小程序地理…

Fourier 测试时间自适应与多级一致性用于鲁棒分类

文章目录 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification摘要方法实验结果 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification 摘要 该研究提出了一种名为 Fourier 测试时间适应(FTT…

汽车车灯的材料是什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车车灯的材料主要包括灯罩和灯底座两部分,它们所使用的材料各不相同。 车灯罩的材料主要是透明且具有良好耐热性和耐紫外线性能的塑料。其中,聚碳酸酯(PC)是一种常用的材料,它具有高抗冲击性、耐化学品腐蚀和优良的…

大数据BI可视化(Echarts组件)项目开发-熟悉结合Vue开发图表组件7.0附带1/6商家销售统计(横向柱状图)

一.创建项目 创建 1.npm install -g vue/cli vue create vision 2. 3. 4.版本 5.是否使用历史路由 6.CSS预处理 7.ES标准配置 8.啥时候es标准提示-保存文件后 9.将配置文件放入单独文件中处理 10.需要保留新建项目以上设置 11.选择“Use PNPM”或者“Use NPM” 12.创建 13访…

五一假期零碎时间练习学习过的内容(商城版)

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性:网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

【4088】基于小程序实现的二手物品交易系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

pandas学习笔记11

DataFrame结构 DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,…

目标检测算法YOLOv5简介

没有关于YOLOv5的直接论文,YOLOv5由Ultralytics维护,源码见:https://github.com/ultralytics/yolov5 ,于2020年6月发布v1.0版本,最新发布版本为v7.0,License为AGPL-3.0. 以下内容主要来自: 1. U…

2024.4.29 Pandas day01 基础语法

pandas是python的一个数据库,在使用数据库的时候需要输入 import pandas as pd 引入, df pd.read.csv(文件路径“):这是利用pandas数据库读取CSV文件的方法,如果读取EXCEL文件或者其他文件,csv文件换成其他…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验,项目团队开发了这套适用于中小型企业的系统,以帮助那些有特定需求的用户。…

Python-Socket编程实现tcp-udp通信

本文章是记录我准备大创项目时学的socket编程的用法,纯属记录生活,没有教学意义,视频我是看b站up主王铭东学的,讲的很详细,我只粗略学了个大概,我想要通过tcp,udp传输yolo目标检测中的物体坐标信…