【Java 设计模式】行为型之模版方法模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 结语

模板方法模式(Template Method Pattern)是一种行为型设计模式,用于定义算法的框架,并将一些步骤的实现延迟到子类。模板方法模式通过定义一个算法骨架,将具体步骤的实现推迟到子类,使得子类可以在不改变算法结构的情况下重定义算法的某些步骤。在本文中,我们将深入研究Java中模板方法模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

模板方法模式是一种行为型设计模式,用于定义算法的框架,并将一些步骤的实现延迟到子类。模板方法模式通过定义一个算法骨架,将具体步骤的实现推迟到子类,使得子类可以在不改变算法结构的情况下重定义算法的某些步骤。模板方法模式通常包含两个主要角色:抽象模板(Abstract Template)和具体模板(Concrete Template)。

  • 抽象模板(Abstract Template): 定义了算法的骨架,包含一些抽象的步骤,将具体步骤的实现延迟到子类
  • 具体模板(Concrete Template): 实现了抽象模板中的具体步骤,完成算法的实际实现

2. 应用场景

模板方法模式通常在以下场景中使用:

  • 算法的框架已经确定,但某些步骤的具体实现可能会变化:

    当算法的框架已经确定,但某些具体步骤的实现可能会变化时,可以使用模板方法模式

  • 重用性要求较高:

    当希望在不改变算法结构的情况下,重用算法的某些部分时,可以使用模板方法模式

  • 固定算法的框架,但允许具体步骤的实现发生变化:

    当希望固定算法的框架,但允许具体步骤的实现发生变化时,可以使用模板方法模式

3. 代码实现

下面通过一个简单的例子来演示模板方法模式的实现。假设有一个咖啡和茶的制备过程,我们可以使用模板方法模式定义一个制备饮料的框架。

抽象模板 - 制备饮料 BeverageTemplate

package com.cheney.demo;abstract class BeverageTemplate {// 制备饮料的算法骨架public final void prepareBeverage() {boilWater();brew();pourInCup();addCondiments();}// 烧水protected void boilWater() {System.out.println("烧水");}// 冲泡protected abstract void brew();// 倒入杯中protected void pourInCup() {System.out.println("倒入杯中");}// 添加调料protected abstract void addCondiments();
}

具体模板 - 制备咖啡 Coffee

package com.cheney.demo;class Coffee extends BeverageTemplate {@Overrideprotected void brew() {System.out.println("冲咖啡");}@Overrideprotected void addCondiments() {System.out.println("添加糖和牛奶");}
}

具体模板 - 制备茶 Tea

package com.cheney.demo;class Tea extends BeverageTemplate {@Overrideprotected void brew() {System.out.println("泡茶");}@Overrideprotected void addCondiments() {System.out.println("添加柠檬");}
}

客户端启动类 Main

package com.cheney.demo;public class Main {public static void main(String[] args) {// 使用模板方法模式冲咖啡和泡茶System.out.println("冲咖啡:");BeverageTemplate coffee = new Coffee();coffee.prepareBeverage();System.out.println("泡茶:");BeverageTemplate tea = new Tea();tea.prepareBeverage();}
}

在上述例子中,BeverageTemplate 是抽象模板,定义了制备饮料的算法骨架,包含了一些抽象的步骤,将具体步骤的实现延迟到子类。CoffeeTea 是具体模板,实现了抽象模板中的具体步骤,完成了冲咖啡和泡茶的实际实现。

在客户端中,我们使用模板方法模式冲咖啡和泡茶。通过继承抽象模板并实现其中的抽象步骤,我们可以定制不同饮料的制备过程,而不改变算法的整体结构。

结语

模板方法模式是一种用于定义算法框架,并将一些步骤的实现延迟到子类的设计模式。通过使用模板方法模式,可以固定算法的框架,同时允许具体步骤的实现发生变化,提高了代码的复用性和可维护性。在实际开发中,模板方法模式常被用于实现具体算法的共享部分,例如,GUI框架中的事件处理、Junit中的测试方法等。通过合理使用模板方法模式,可以使系统更加灵活和可扩展。


【Java 设计模式】系列 《23 种设计模式》 与 《7 大设计原则》 总纲
🚩设计原则
✨单一职责原则(SRP) 规定一个类应该只有一个引起变化的原因
✨开放/封闭原则(OCP) 表明软件实体应该是可以扩展的,但是不可修改的
✨里氏替换原则(LSP) 强调派生类必须能够替代其基类而不引起程序错误
✨依赖倒置原则(DIP) 倡导高层模块不应该依赖于低层模块,二者都应该依赖于抽象
✨接口隔离原则(ISP) 提倡一个类不应该被强迫依赖它不使用的接口
✨合成/聚合复用原则(CARP) 建议尽量使用合成/聚合,尽量不要使用继承
✨迪米特法则(LoD) 规定一个对象应该对其他对象有最少的了解

🚀创建型设计模式
✨单例模式 保证一个类仅有一个实例,并提供一个访问它的全局点
✨工厂方法模式 定义一个用于创建对象的接口,但是由子类决定实例化哪一个类
✨抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
✨建造者模式 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
✨原型模式 通过复制现有的对象来创建新对象,而不是从头开始创建

🚀结构型设计模式
✨适配器模式 将一个类的接口转换成客户希望的另外一个接口
✨桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化
✨组合模式 将对象以树形结构组合以表示“部分-整体”的层次结构
✨装饰器模式 动态地给一个对象添加一些额外的职责
✨外观模式 为子系统中的一组接口提供一个一致的界面
✨代理模式 为其他对象提供一种代理以控制对这个对象的访问
✨享元模式 用共享的方式高效地支持大量小粒度对象

🚀行为型设计模式
✨观察者模式 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会受到通知并自动更新
✨策略模式 定义一系列算法,将它们封装起来,并且使它们可以相互替换
✨命令模式 将请求封装成对象,使得可以用不同的请求对客户进行参数化
✨状态模式 允许对象在其内部状态改变时改变它的行为
✨责任链模式 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求
✨访问者模式 将算法与对象结构分离,并且可以在不改变对象结构的前提下定义新的操作
✨中介者模式 用一个中介对象来封装一系列的对象交互
✨备忘录模式 在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态
✨迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示
✨模版方法模式 定义一个操作中的算法的骨架,将一些步骤延迟到子类中
✨解释器模式 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子

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

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

相关文章

Linux实验记录:使用LVM(逻辑卷管理器)

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: 硬盘分好区或者部署为RAID磁盘阵列…

Python根据Excel表进行文件重命名

一、问题背景 在日常办公过程中,批量重命名是经常使用的操作。之前我们已经进行了初步探索,主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…

MySQL:三大日志(binlog、redolog、undolog)

再了解三个日志前我们先了解一下MySQL的两层架构: Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数和所有跨…

Unity读书系列《Unity3D游戏开发》——拓展编辑器(一)

文章目录 前言一、扩展Project视图1、右键扩展菜单(Asset)2、监听事件3、拓展布局 二、扩展Hierarchy视图1、拓展菜单(GameObject)2、拓展布局3、重写菜单 三、扩展Inspector视图1、扩展原生组件2、扩展继承组件 四、扩展Scene视图…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(四十七)

说明: 面试群,群号: 228447240面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但…

【每日一题】5.LeetCode——环形链表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

抖店春节飞鸽还用回复吗?飞鸽自动回复怎么设置?

一、抖店春节飞鸽还用回复吗? 在春节期间,由于员工休假和放假的原因,客服人员数量可能会减少。这就导致了客服团队在春节期间的人手不足,难以及时回复顾客的咨询和问题。 然而,为了保证顾客的满意度和体验&#xff0…

【智能家居入门之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据,之后会持续发布如下项目:①可以实现微信小程序控制下位机动作,真正意义上的智能家居;②将网络通讯协议换成MQTT协议再实现上述功能,此时的服务器也不再是ONENET&…

c# 对路径的访问被拒绝

c#写入一个文件,报错: c# 对路径的访问被拒绝 解决方法: 检查文件路径和目录权限: 确保你的应用程序有权限写入指定的文件或目录。在某些情况下,你可能需要以管理员身份运行应用程序或更改文件/目录的权限。 确保目…

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法,它将连续的相同字符(重复 2 次或更多次)替换为字符和表示字符计数的数字(行程长度)…

将图片批量导入PPT

1.代码 这部分使用到了“python-pptx”这个库,首先设置储存图片的文件夹路径,输入新建PPT的名字,然后自动将文件夹下的JPG图片按编号顺序写入PPT文件,最后保存: import os import pptx from pptx.util import Inches …

Linux:简单聊聊线程调度

目录 一、什么是线程调度?二、什么时候会进行线程调度?三、什么原因会导致某个线程调度延迟?四、内核抢占和抢占式调度五、应用层线程优先级设置过高会导致什么问题? 在工作中,线程调度这个词我们经常提及,…

MyBatis详解(6)-- 分页及缓存

MyBatis详解(6) 分页缓存特点:限制:术语:加载分类立即加载:延迟加载:mybatis缓存: 缓存的适用性MyBatis 缓存分类一级缓存注意:一级缓存未命中二级缓存二级缓存的优劣自定…

java - 多态

多态:它允许不同类型的对象对同一方法进行不同的实现, 具体来说,多态性指的是:通过父类的引用变量,来引用子类的对象,从而实现对不同对象的统一操作。 多态,只适用于方法,不适用于属…

php小数四舍五入、向上取整、向下取整

简单示例 1、round 对浮点数进行四舍五入 $result round(3.456, 2); var_dump($result);// 输出结果为:double(3.46)$result round(3.451, 2); var_dump($result);// 输出结果为:double(3.45) 2、ceil 进一取整:向上取整返回下一个最高的整数 $r…

qq通讯录怎么关闭?QQ好友删除了怎么恢复?

在QQ中,通讯录是我们管理好友和进行聊天的重要工具,但有时候我们可能需要一些隐私保护,不让一些用户通过手机通讯录添加自己。如果您正在思考qq通讯录怎么关闭以及恢复意外删除的好友,本文将为您详细介绍如何关闭QQ通讯录和恢复被…

php实现多进程的几种方式

目录 一:使用pcntl扩展库 二:使用Swoole扩展 三:使用多进程模式PHP-FPM 在PHP中实现多进程主要有以下几种方式: 一:使用pcntl扩展库 pcntl扩展库提供了多线程相关的函数,如pcntl_fork()用于创建子进程…

详解操作系统各章大题汇总(死锁资源分配+银行家+进程的PV操作+实时调度+逻辑地址->物理地址+页面置换算法+磁盘调度算法)

文章目录 第三章:死锁资源分配图例一例二 第三章:银行家算法第四章:进程的同步与互斥做题步骤PV操作的代码小心容易和读者写者混 1.交通问题(类似读者写者)分析代码 2.缓冲区问题(第二个缓冲区是复制缓冲区…

RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试