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

编程-设计模式 23:模板方法模式

设计模式 23:模板方法模式

定义与目的
  • 定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 目的:该模式的主要目的是封装算法的框架,允许子类提供具体的实现细节,而不改变算法的整体结构。
实现示例

假设我们有一个简单的游戏,玩家需要经历一系列的挑战才能通关。我们可以使用模板方法模式来实现这个需求。

// 抽象类 - 游戏
abstract class Game {// 模板方法final void play() {makePreparations();startGame();playGame();endGame();}protected void makePreparations() {System.out.println("Making preparations...");}protected abstract void startGame();protected abstract void playGame();protected void endGame() {System.out.println("Game over!");}
}// 具体类 - 冒险游戏
class AdventureGame extends Game {@Overrideprotected void startGame() {System.out.println("Starting adventure game...");}@Overrideprotected void playGame() {System.out.println("Exploring dungeons, fighting monsters...");}
}// 具体类 - 战略游戏
class StrategyGame extends Game {@Overrideprotected void startGame() {System.out.println("Starting strategy game...");}@Overrideprotected void playGame() {System.out.println("Building structures, training troops...");}
}// 客户端代码
public class Client {public static void main(String[] args) {Game adventureGame = new AdventureGame();Game strategyGame = new StrategyGame();System.out.println("Playing adventure game:");adventureGame.play();System.out.println("\nPlaying strategy game:");strategyGame.play();}
}
使用场景
  • 当你需要定义算法的骨架,而将一些步骤留给子类去实现时。
  • 当你需要确保一系列方法的调用顺序不变,但允许个别方法的具体实现不同。
  • 当你需要在不改变算法结构的情况下重定义算法的某些步骤时。

模板方法模式通过定义算法的骨架,并将一些步骤留给子类去实现,使得子类可以在不改变算法结构的情况下重定义算法的某些步骤。这对于需要确保一系列方法的调用顺序不变,但允许个别方法的具体实现不同的场景非常有用。

小结

模板方法模式是一种常用的行为型模式,它可以帮助你定义算法的骨架,而将一些步骤留给子类去实现。这对于需要确保一系列方法的调用顺序不变,但允许个别方法的具体实现不同的场景非常有用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mfc140u.dll丢失的科学修复手段,简单又方便的mfc140u.dll修复
  • Ant-Design-Vue快速上手指南+排坑
  • 前端八股文笔记【三】
  • 前端(react)框架nextjs
  • C++ 数组 -- 指针 -- 字符串
  • 【系统分析师论文】论系统需求分析方法及应用
  • 【wiki知识库】09.欢迎页面展示(浏览量统计)SpringBoot部分
  • 【MySQL】视图——视图、视图的概念、为什么要使用视图、视图的基本使用、视图规则和限制
  • 如何在linux系统上部署nginx
  • 动态规划之——背包DP(完结篇)
  • 【redis】redis 消息队列学习
  • 分布式数据库的原理、发展历史与技术特点
  • LLM - 使用 HuggingFace + Ollama 部署最新大模型 (GGUF 格式 与 Llama 3.1)
  • openssl 制作 信用库与服务证书
  • 深入理解JavaScript中的Promise.race
  • [LeetCode] Wiggle Sort
  • [nginx文档翻译系列] 控制nginx
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular 响应式表单之下拉框
  • conda常用的命令
  • ECMAScript6(0):ES6简明参考手册
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • HTML中设置input等文本框为不可操作
  • JavaScript异步流程控制的前世今生
  • js 实现textarea输入字数提示
  • JS学习笔记——闭包
  • js中forEach回调同异步问题
  • js作用域和this的理解
  • Kibana配置logstash,报表一体化
  • Mybatis初体验
  • spring boot 整合mybatis 无法输出sql的问题
  • 仿天猫超市收藏抛物线动画工具库
  • 欢迎参加第二届中国游戏开发者大会
  • 如何进阶一名有竞争力的程序员?
  • 微信小程序:实现悬浮返回和分享按钮
  • 温故知新之javascript面向对象
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 异步
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​力扣解法汇总946-验证栈序列
  • ​字​节​一​面​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (09)Hive——CTE 公共表达式
  • (1)svelte 教程:hello world
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Forward) Music Player: From UI Proposal to Code
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测