设计模式使用场景实现示例及优缺点(行为型模式——模板方法模式)

模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法的骨架,将算法的一些步骤延迟到子类中。这样可以在不改变算法的结构的前提下,重新定义算法的某些特定步骤。

核心组件

  • AbstractClass(抽象类):这是一个抽象基类,它定义了一套算法的模板。它实现了模板方法,定义了算法的骨架,具体步骤由子类实现。
  • ConcreteClass(具体类):这些类继承自抽象基类,并实现其算法中的具体步骤。

适用场景

  1. 一次性实现算法的不变部分
    • 当算法的大部分结构固定不变,但某些步骤具有多变性时,可使用模板方法模式。
  2. 各子类中公共行为应提取到单一位置避免代码重复
    • 通过模板方法模式,可以将公共行为提取到超类中,通过继承机制复用这部分代码。
  3. 控制子类扩展
    • 模板方法模式通过将算法的核心流程固化在超类中,防止子类破坏原有算法的结构。

实现实例

以一个简单的游戏开发为例,其中游戏的基本结构(启动、开始、结束)是固定的,但具体每个阶段的实现可以根据不同类型的游戏变化。使用模板方法模式可以固定游戏的主体流程,而将具体步骤的实现留给子类:

抽象类(Abstract Class)

这个类定义了游戏的基本流程,并将具体实现留给子类。

public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法public final void play() {initialize();  // 初始化游戏startPlay();   // 开始游戏endPlay();     // 结束游戏}
}
具体类(Concrete Classes)

这些类继承自抽象基类,并实现了其具体的操作。

public class Cricket extends Game {@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}
}public class Football extends Game {@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}@Overridevoid endPlay() {System.out.println("Football Game Finished!");}
}
客户端代码(Client Code)

这部分代码演示了如何使用模板方法模式来规范游戏的流程。

public class Client {public static void main(String[] args) {Game game = new Cricket();game.play();  // 按照Cricket的流程执行游戏game = new Football();game.play();  // 按照Football的流程执行游戏}
}

优缺点

优点
  1. 提高代码复用性
    • 将通用部分的代码放在抽象的父类中,减少了子类的重复代码。
  2. 扩展性好
    • 新增具体类时,只需实现算法的可变部分,不需修改已有的代码。
  3. 控制子类扩展
    • 可以在超类中定义严格的算法规则,限定子类的行为和结构。
缺点
  1. 对继承的依赖
    • 模板方法模式通过继承来实现,可能会导致过多的类层次。
  2. 可能违背Liskov替换原则
    • 如果子类不适当地实现父类的方法,可能会违背Liskov替换原则。

类图

+----------------+         +------------------+
|   AbstractClass|-------->|   ConcreteClass  |
+----------------+         +------------------+
| + templateMethod()       | + step1()        |
| + step1()                | + step2()        |
| + step2()                +------------------+
| + step3()                |
+----------------+         |
| + step3()                |
+----------------+         ||+-------------------+||                   |
+---------------+ +-----------------+
|ConcreteClassA | |ConcreteClassB   |
+---------------+ +-----------------+
| + step1()     | | + step1()       |
| + step2()     | | + step2()       |
| + step3()     | | + step3()       |
+---------------+ +-----------------+

注意事项

设计灵活性与复杂性:

模板方法模式虽然提高了代码的复用性,但也可能导致设计过于复杂。在设计时应确保不过度使用,以免造成系统的不必要复杂。

子类的设计约束:

子类实现时必须遵循抽象基类的方法模板,这限制了子类的灵活性。设计者需要在提供足够的灵活性和维持算法结构之间找到平衡。

重构与维护:

如果模板方法本身需要修改,可能会影响到所有的子类。因此,在模板方法中应尽量减少修改的可能性,确保长时间的稳定性。

总结

模板方法模式是一种强大的设计工具,通过预定义算法的结构,提供了高度的复用性和扩展性。它不仅适用于软件开发,还广泛应用于系统设计和业务流程管理。通过对模式的适当扩展和优化,可以有效应对更加复杂和动态的设计挑战。这种模式的成功实施需要深入理解业务需求和技术上的灵活运用,以确保设计的可维护性和系统的可扩展性。

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

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

相关文章

Git使用介绍教程

Git使用介绍教程 小白第一次写博客,内容写的可能不是很详细,仅供参考,大家一起努力 gitee网址:https://gitee.com 大部分的开发团队都以 Git 作为自己的版本控制工具,需要对 Git 的使用非常的熟悉。这篇文章中本人整理了自己在开发过程中经常使用到的 Git 命令,方便在偶…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官网:https://goharbor.io/ 点击 Download now 链接,会自动跳转到上述github页面&am…

C++ | Leetcode C++题解之第233题数字1的个数

题目: 题解: class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中,可以发现 k 并没有被直接使用到(都是使用 10^k)// 但为了让代码看起来更加直观,这里保留了 klong l…

Redis系列命令更新--Redis哈希命令

一、设置密码验证: 使用文本编辑器,这里使用Notepad,打开Redis服务配置文件。 注意:不要找错了,通常为redis.windows-service.conf,而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置…

使用个人p12证书请求https接口数据

依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>code package com.hexin.cbas.test;import org.apache.commons.net.util.TrustM…

《BASeg: Boundary aware semantic segmentation for autonomous driving》论文解读

期刊&#xff1a;Neural Networks | Journal | ScienceDirect.com by Elsevier 年份&#xff1a;2023 代码&#xff1a;https://github.com/Lature-Yang/BASeg 摘要 语义分割是自动驾驶领域街道理解任务的重要组成部分。现有的各种方法要么专注于通过聚合全局或多尺度上下文…

旷野之间20 - Google 研究的推测 RAG

为什么选择 RAG 新兴能力 直到最近&#xff0c;人们发现 LLM 具有新兴能力&#xff0c;即在与用户或任务交互过程中出现的意外功能。 这些功能的示例包括&#xff1a; 解决问题&#xff1a; LLM 可以利用其语言理解和推理能力&#xff0c;为未经过明确培训的任务提供富有洞…

js的原型链

原型链: 1.如何构成原型链&#xff1f; 2.原型链上属性的增删改查。 3.绝大多数对象的最终都会继承自Object.prototype (var obj Object.create(null或者undefined)没有原型)。 4.Object.create(原型)。 构成原型链和操作原型链属性&#xff1a; //最顶的原型是Object.pro…

性能优化篇:SQL数据库查表速度优化

SQL数据库查询的性能优化是确保数据库能够快速响应和高效处理请求的关键。以下是一些常见的SQL数据库查询性能优化方法: 索引优化: 创建适当的索引:为经常在WHERE子句中使用的列、JOIN操作涉及的列以及排序操作涉及的列创建索引。避免过多的索引:虽然索引可以提高查询速度,…

python的字符串

字符串 简单操作 创建 利用 ‘ ’ 或 “ ” 将字符或数字包裹起来的都为字符串 a"你好" 格式化字符串 元组的字符格式化 字符串格式化函数 srt.format() f格式化 方法 split()//指定分割符经行分割 strip()//指定移除字符头尾的字符 join()//指定序列中的字符连接成新…

【Perl】Perl 语言入门

1. Perl语言介绍 Perl 是一种高级、解释型、动态编程语言&#xff0c;由Larry Wall在1987年发布。Perl 以其强大的文本处理能力而闻名&#xff0c;特别是在处理报告生成、文件转换、系统管理任务等方面。它吸收了C、Shell脚本语言、AWK、sed等语言的特性&#xff0c;并加入了大…

Go:常量运算符流程控制

目录 一、常量 1.1 常量基本定义 1.2 常量组的定义 1.3 常量枚举 二、运算符 2.1 算数运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 位运算符 2.5 赋值运算符 2.6 指针运算符 2.7 运算符优先级 三、流程控制 3.1 if-else 条件语句 3.2 switch-case语句 3.3 for 循…

5、 测试

这里写目录标题 1、自动化测试简介&#xff08;1&#xff09;自动化测试是什么&#xff08;2&#xff09;为什么要写测试测试节约你的时间发现错误&#xff0c;预防错误测试使得代码更有吸引力 2、基础测试策略3、开始写第一个测试&#xff08;1&#xff09;首先得有个bug&…

Not Invented Here 不是在这里发明的 / Proudly found elsewhere 自豪地在其他地方找到

注&#xff1a; 机翻&#xff0c;未校对。 两篇关于创新管理的小文章 Not Invented Here 不是在这里发明的 In the history of organizational success, the enterprises that dominate tend to flawlessly execute on ideas that were created elsewhere. Examine just abo…

智慧水利解决方案:从理论到实践的全面跨越,展示其在水资源管理、水灾害预警、水生态保护等方面的创新应用

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、智慧水利的理论框架与技术体系 1、理论框架 2、技术体系 三、智慧水利在水资源管理中的应用 1、水资源优化配置 2、水量水质协同管理 四、智慧水利在水灾害预警中的应用 1、洪水预警与应急响应 2、干旱监测与评…

git 创建分支--命令行

在Git中创建分支是一个相对简单且重要的操作&#xff0c;它允许开发者在不影响主代码库的情况下进行开发或修复工作。以下是创建Git分支的步骤&#xff1a; 一、基本步骤 打开命令行终端&#xff1a; 首先&#xff0c;需要打开命令行终端&#xff08;在Windows上可以是CMD、Po…

Mediapipe-姿态估计实例

Mediapipe简介 Mediapipe 是由 Google Research 开发的一款开源框架&#xff0c;旨在帮助开发者轻松地构建、测试和部署复杂的多模态、多任务的机器学习模型。它特别擅长于实时处理和分析音频、视频等多媒体数据。以下是 Mediapipe 的一些关键特点和组件&#xff1a; 关键特点…

基于微信小程序的音乐播放平台

基于微信小程序的音乐播放平台 音乐播放小程序项目简介技术栈功能模块项目流程系统E-R图项目页面 音乐播放小程序 项目简介 微信音乐小程序旨在提供一个简洁高效的音乐播放平台&#xff0c;用户可以方便地搜索、播放和收藏自己喜欢的音乐。整个项目采用前后端分离的架构&…

WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

环境&#xff1a; Win10 专业版 DELL7080 问题描述&#xff1a; WIN10开机突然&#xff0c;过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解决方案&#xff1a; 1.找到MEMORY.DMP文件内容&#xff0c;分析一下 Microsoft (R) Windows Debugger Version 10…

主机安全-开源HIDS字节跳动Elkeid安装使用

目录 概述什么是HIDSHIDS与NIDS的区别EDR、XDR是啥&#xff1f; Elkeid架构Elkeid Agent && Agent centerElkeid DriverElkeid RASPElkeid HUBService DiscoveryManager安装数据采集规则&告警 参考 概述 什么是HIDS HIDS&#xff08; host-based intrusion detec…