【模版方法设计模式】
文章目录
- 模板方法设计模式
- 模板方法的设计原则
- 模板方法设计模式组成部分
- 代码实现
- 抽象类实现
- 具体实现类
- 执行
模板方法设计模式
模版方法设计模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。
这种设计模式的主要目的是让某些方法的具体实现推迟到子类中去完成,提供一种代码复用的机制。
模板方法的设计原则
1.单一职责:一个类和方法只做一件事。
2.开闭原则:对修改关闭,对扩展开发。
3.里氏替换原则:子类可扩展新方法,但不可修改父类已有方法(父类已提供了具体实现的方法)。
4.依赖倒置:依赖于抽象,而非具体实现,即面向接口编程(如方法参数,类属性使用接口声明,这样可接收任何子类)。
5.接口隔离:使用多个隔离的接口定义抽象,降低耦合。
6.最少知道/迪米特原则:降低类之间的依赖,聚合,组合等。
模板方法设计模式组成部分

抽象类(Abstract Class):
包含了模版方法及其所需的基本操作方法。
模版方法定义了算法的骨架,通常是由一些基本操作方法组成的步骤。
基本操作方法可以是抽象的(需要子类实现)或具体的(提供默认实现)。
具体子类(Concrete Class):
实现了抽象类中的基本操作方法。
通过重写基本操作方法,子类可以定制算法的某些步骤。
代码实现
抽象类实现
// 抽象类,定义了制作饮料的算法骨架
abstract class Beverage {// 模版方法,定义了制作饮料的步骤public final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}// 基本操作方法protected abstract void brew(); // 子类实现protected abstract void addCondiments(); // 子类实现private void boilWater() {System.out.println("Boiling water");}private void pourInCup() {System.out.println("Pouring into cup");}
}
具体实现类
// 具体子类,具体实现制作茶的步骤
class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("Steeping the tea");}@Overrideprotected void addCondiments() {System.out.println("Adding lemon");}
}// 具体子类,具体实现制作咖啡的步骤
class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("Dripping coffee through filter");}@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk");}
}
执行
// 客户端代码
public class TemplateMethodPatternDemo {public static void main(String[] args) {Beverage tea = new Tea();tea.prepareRecipe();Beverage coffee = new Coffee();coffee.prepareRecipe();}
}
相关文章:
【模版方法设计模式】
文章目录 模板方法设计模式模板方法的设计原则模板方法设计模式组成部分代码实现抽象类实现具体实现类执行 模板方法设计模式 模版方法设计模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一…...
rust语言初识
程序设计实践课上水一篇ing 来源:rust基础入门-1.初识rust-酷程网 (kucoding.com) rust作为一名新兴语言,与go又有些许不同,因为它的目标是对标系统级开发,也就是C、C这两位在编程界的位置。比如我们最常用的windows系统&#x…...
知识图谱数据预处理笔记
知识图谱数据预处理笔记 0. 引言1. 笔记1-1. \的转义1-2. 特殊符号的清理1-3. 检查结尾是否正常1-4. 检查<>是否存在1-5. 两端空格的清理1-6. 检查object内容长时是否以<开始 0. 引言 最近学习知识图谱,发现数据有很多问题,这篇笔记记录遇到的…...
Unity面试八股文之基础篇
文章目录 前言1. Unity的生命周期加载第一个场景Editor在第一次帧更新之前帧之间更新顺序协程销毁对象时退出时 2. Unity 协程和线程,进程的区别3. 本地坐标系 世界坐标系4. 碰撞器和触发器的区别后话 前言 开设这个栏目的博文会写一些有关unity的面试题目,在面试的…...
HTTPS能否避免流量劫持?如何实现HTTPS
在当今数字化时代,网站安全已经成为企业和个人的头等大事。随着网络犯罪和数据泄露的增加,保护您的网站免受潜在威胁比以往任何时候都更加重要。网站安全的一个关键组成部分是HTTPS,它代表着安全的超文本传输协议。HTTPS是标准HTTP协议的安全…...
簡述Vue 2.0 响应式数据的原理
Vue 2.0 响应式数据的原理主要基于以下几个关键点: 数据劫持与Object.defineProperty: Vue 2.0 使用 Object.defineProperty 方法来劫持对象的属性,为其添加 getter 和 setter 方法。当数据被访问或修改时,这些 getter 和 setter …...
Kafka线上集群部署方案怎么做?no.6
专栏前面几期内容,我分别从Kafka的定位、版本的变迁以及功能的演进等几个方面循序渐进地梳理了Apache Kafka的发展脉络。通过这些内容,我希望你能清晰地了解Kafka是用来做什么的,以及在实际生产环境中该如何选择Kafka版本,更快地帮…...
vscode 的 AI 协助插件 Tabnine / Codeium
4.1、Tabnine 描述:Tabnine 是一款基于深度学习技术的代码自动补全工具。该插件支持多种编程语言,包括 Python、JavaScript、TypeScript、Java 和 Go 等。它可以根据您输入的代码段和上下文信息,预测并推荐可能的代码补全选项,从而…...
Flutter 中的 OutlineButton 小部件:全面指南
Flutter 中的 OutlineButton 小部件:全面指南 在Flutter的Material Design组件库中,OutlineButton是一个用于创建带边框的扁平按钮的小部件。这种按钮通常用于次要操作或在需要强调其他按钮的情况下使用。本文将为您提供一个全面的指南,帮助…...
Kubernetes可视化界面之DashBoard
1.1 DashBoard Kubernetes Dashboard 是 Kubernetes 集群的一个开箱即用的 Web UI,提供了一种图形化的方式来管理和监视 Kubernetes 集群中的资源。它允许用户直接在浏览器中执行许多常见的 Kubernetes 管理任务,如部署应用、监控应用状态、执行故障排查…...
Docker学习(4):部署web项目
一、部署vue项目 在home目录下创建项目目录 将打包好的vue项目放入该目录下,dist是打包好的vue项目 在项目目录下,编辑default.conf 内容如下: server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {r…...
驱动开发中引入私有数据的原因
系列文章目录 驱动开发中引入私有数据的原因 驱动开发中引入私有数据的原因 系列文章目录驱动开发中引入私有数据的原因 驱动开发中引入私有数据的原因 驱动开发中引入私有数据(Private Data)概念主要是为了解决以下几个关键问题: 1.多设备支…...
删除edge浏览器文本框储存记录值以及关闭自动填充
当我们点击输入框时总会出现许多以前输入过的信息。 一、删除edge浏览器文本框储存记录值 1、首先按下↓键选中你想删除的信息 二、关闭自动填充。 1、在地址栏输入edge://wallet/settings跳转到以下界面 2、往下滑找到 全部取消即可...
mysql事务 事务并发问题 隔离级别 以及原理
mysql事务 简介:事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 事务四大特性 原子性(Atomici…...
Android 性能为王时代SparseArray和HashMap一争高下
文章目录 一、SparseArray 源码分析1. **类定义和构造函数**2. **基本方法**2.1 put(int key, E value)2.2 get(int key)2.3 delete(int key)2.4 removeAt(int index)2.5 gc()2.6 size()2.7 keyAt(int index) 和 valueAt(int index) 3. **辅助方法**3.1 binarySearch() 二、使用…...
学术图表的基本配色方法
不论是商业图表还是专业图表,图表的配色都极其关键。图表配色主要有彩色和黑白两种配色方案。刘万祥老师曾提出: “在我看来,普通图表与专业图表的差别,很大程度就体现在颜色运用上。” 对于科学图表,大部分国内的期…...
【学习笔记】Webpack5(Ⅱ)
Webpack 3、高级篇 3.1、提升开发体验 —— SourceMap 3.2、提升打包速度 3.2.1 HotModuleReplacement 3.2.2 OneOf 3.2.3 Include / Exclude 3.2.4 Cache 3.2.5 Thread 3.3、减少代码体积 …...
oracle碎片整理
1、move碎片整理 1) DECLARE tmp_val VARCHAR2 (500); BEGIN FOR REC IN (SELECT TABLE_NAME FROM USER_TABLES ) LOOP tmp_val:=ALTER TABLE || REC.TABLE_NAME || MOVE; BEGIN EXECUTE IMMEDIATE tmp_val; DBMS_OUTPUT.ENABLE(buffer_size => null); DBMS_OUTPUT.put_l…...
民国漫画杂志《时代漫画》第15期.PDF
时代漫画15.PDF: https://url03.ctfile.com/f/1779803-1247458444-8befd8?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!...
Alamofire常见GET/POST等请求方式的使用,响应直接为json
Alamofire 官方仓库地址:https://github.com/Alamofire/Alamofire xcode中安装和使用:swift网络库Alamofire的安装及简单使用,苹果开发必备-CSDN博客 Alamofire是一个基于Swift语言开发的优秀网络请求库。它封装了底层的网络请求工作&…...
Java全栈工程师的进阶之路:从技术细节到项目实战
Java全栈工程师的进段之路:从技术细节到项目实战 一、面试开场 面试官:你好,我是XX科技的技术面试官,今天来聊聊你的技术和项目经验。先自我介绍一下吧。 应聘者:您好,我叫李明,28岁,…...
如何实现真实感前端游戏碰撞响应:从弹性到摩擦的完整指南
如何实现真实感前端游戏碰撞响应:从弹性到摩擦的完整指南 【免费下载链接】frontend-stuff 📝 A continuously expanded list of frameworks, libraries and tools I used/want to use for building things on the web. Mostly JavaScript. 项目地址: …...
OpenClaw自动化测试:Qwen3-14B驱动的代码审查机器人
OpenClaw自动化测试:Qwen3-14B驱动的代码审查机器人 1. 为什么需要自动化代码审查 去年参与一个开源项目时,我经常在深夜提交代码后收到维护者的评论:"这里有个拼写错误"、"那个变量命名不规范"。这种延迟反馈让我意识…...
二进制逆向新选择:Binary Ninja核心功能与实战指南
二进制逆向新选择:Binary Ninja核心功能与实战指南 【免费下载链接】deprecated-binaryninja-python Deprecated Binary Ninja prototype written in Python 项目地址: https://gitcode.com/gh_mirrors/de/deprecated-binaryninja-python 一、定位解析&#…...
Windows下OpenClaw安装指南:Qwen3-14b_int4_awq模型接入与飞书机器人配置
Windows下OpenClaw安装指南:Qwen3-14b_int4_awq模型接入与飞书机器人配置 1. 为什么选择OpenClaw作为个人自动化助手 去年年底,我开始寻找一款能够真正理解自然语言指令的本地自动化工具。当时市面上大多数RPA工具都需要复杂的流程设计,直到…...
Youtu-Parsing文档解析5分钟上手:零基础搞定PDF/表格/手写体识别
Youtu-Parsing文档解析5分钟上手:零基础搞定PDF/表格/手写体识别 1. 前言:为什么需要文档解析工具? 每天我们都会遇到各种文档处理需求:扫描的合同需要转为电子版、手写笔记要整理归档、PDF报告中的表格数据需要提取分析。传统方…...
科研论文翻译难题?试试MathTranslate的公式无损转换方案
科研论文翻译难题?试试MathTranslate的公式无损转换方案 【免费下载链接】MathTranslate translate scientific papers in latex, especially arxiv papers 项目地址: https://gitcode.com/gh_mirrors/ma/MathTranslate 学术研究中,英文文献阅读往…...
Rustup终极指南:轻松管理你的Rust开发环境
Rustup终极指南:轻松管理你的Rust开发环境 【免费下载链接】rustup The Rust toolchain installer 项目地址: https://gitcode.com/gh_mirrors/ru/rustup 你是否曾经为管理多个Rust版本而烦恼?或者在不同项目间切换工具链时感到困惑?R…...
Janus-Pro-7B多模态效果展示:基于Transformer架构的图像描述与问答
Janus-Pro-7B多模态效果展示:基于Transformer架构的图像描述与问答 最近在体验各种多模态大模型,发现了一个挺有意思的选手——Janus-Pro-7B。它主打一个能力:不仅能看懂图片,还能用文字把看到的东西描述出来,甚至能跟…...
AIS_4G扩展板嵌入式驱动开发与多传感器融合实践
1. AIS_4G_EXTENSION_BOARD 硬件平台概述AIS_4G_EXTENSION_BOARD 是一款专为 AIS 4G 主控板(基于 ESP32 的 Magellan 平台)设计的扩展功能子板,采用模块化设计理念,集成多类工业级传感器接口与关键外设控制器。该板并非独立运行单…...
