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

【设计模式】第24节:行为型模式之“模板方法模式”

一、简介

模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。

模板模式有两大作用:复用和扩展。其中,复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。

二、优点

  • 代码复用
  • 统一算法框架
  • 封装不变,扩展可变

三、适用场景

  • 一次性实现算法的不变部分
  • 集中公共行,避免代码重复

四、UML类图

请添加图片描述

五、案例

有下棋和足球两种游戏,它们的游玩过程类似,都是分为初始化、玩游戏、结束游戏三步。

package mainimport "fmt"type Game interface {InitializeGame()PlayGame()EndGame()
}func Play(game Game) {game.InitializeGame()game.PlayGame()game.EndGame()
}type Chess struct {
}func NewChess() *Chess {return &Chess{}
}func (c *Chess) InitializeGame() {fmt.Println("Initializing Chess Game")
}func (c *Chess) PlayGame() {fmt.Println("Playing Chess Game")
}func (c *Chess) EndGame() {fmt.Println("Ending Chess Game")
}type Football struct {
}func NewFootball() *Football {return &Football{}
}func (f *Football) InitializeGame() {fmt.Println("Initializing Football Game")
}func (f *Football) PlayGame() {fmt.Println("Playing Football Game")
}func (f *Football) EndGame() {fmt.Println("Ending Football Game")
}func main() {chess := NewChess()Play(chess)football := NewFootball()Play(football)
}

相关文章:

  • Jenkins项目部署
  • 医学AI智能导诊系统源码
  • NB-IOT的粮库挡粮门异动监测装置
  • 【设计模式之原型模式 】– C++
  • <多线程章节八> 单例模式中的饿汉模式与懒汉模式的讲解,以及懒汉模式中容易引起的Bug
  • 13.7性能测试工具(LoadRunner)(简单扫盲)
  • 【设计模式】第25节:行为型模式之“访问者模式”
  • 通过gosec白盒扫描Go代码中的SQL注入
  • Pytorch 猫狗识别案例
  • DAY40 343. 整数拆分 + 96. 不同的二叉搜索树
  • LeetCode 面试题 16.10. 生存人数
  • [USACO23OPEN] Field Day S题解
  • CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板
  • Kamailio uac_replace和uac_restore
  • 电脑屏幕监控软件,能够帮助企业完成哪些事情?
  • SegmentFault for Android 3.0 发布
  • Django 博客开发教程 8 - 博客文章详情页
  • emacs初体验
  • exports和module.exports
  • js数组之filter
  • Just for fun——迅速写完快速排序
  • leetcode386. Lexicographical Numbers
  • LintCode 31. partitionArray 数组划分
  • nodejs调试方法
  • PAT A1092
  • PHP CLI应用的调试原理
  • React 快速上手 - 07 前端路由 react-router
  • sublime配置文件
  • vue总结
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 后端_ThinkPHP5
  • 基于webpack 的 vue 多页架构
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 思否第一天
  • 主流的CSS水平和垂直居中技术大全
  • const的用法,特别是用在函数前面与后面的区别
  • 阿里云服务器购买完整流程
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #微信小程序(布局、渲染层基础知识)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)菜鸟学数据库(三)——存储过程
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ***通过什么方式***网吧