【设计模式】第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)
}

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

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

相关文章

Tailwind CSS vs 现代CSS,Tailwind CSS 会像CSS-in-JS 一样亡?

本文是 关于Tailwind CSS 与 现代 CSS之间比较的文章。文章中作者详细比较了这两种CSS开发方法的优缺点。他指出,Tailwind CSS是一种基于类的CSS框架,提供了快速开发网站的便利性,但可能导致HTML代码的臃肿。另一方面,现代CSS方法…

蓝桥杯每日一题2023.10.31

题目描述 全球变暖 - 蓝桥云课 (lanqiao.cn) 题目分析 果然有关连通块类的问题使用dfs都较为好写~~ 我们可以通过判断连通块的代码来加上部分条件算出被完全淹没的岛屿个数 在岛屿中如果有为"#"的a[i][j]上下左右全部是"#"则说明此岛屿一定不会被完全…

C++中空间搜索树rtree的使用

目录 1 基础使用 1 基础使用 &#xff08;一&#xff09;头文件 #include "mapmatch/r_tree.h" &#xff08;二&#xff09;创建rtree had::RTree<SDDBLink*, double, 2> _sdlink_geo_tree; //声明rtree //创建rtree for (auto iter_sdlink : map_sd_link) …

SQL Server 中定时调度调用存储过程

要在SQL中定时调度调用存储过程&#xff0c;你可以使用SQL Server代理&#xff08;如果你正在使用SQL Server数据库&#xff09;。下面是一些步骤来配置SQL Server代理以定时调度调用存储过程&#xff1a; 打开SQL Server Management Studio (SSMS) 并连接到你的SQL Server实例…

MojoUserAgent库

Mojo::UserAgent 是 Perl 编程语言中的一个库&#xff0c;用于创建和管理 HTTP 请求。它提供了一个简单而强大的接口&#xff0c;用于发送 HTTP 请求并处理响应。 以下是一个使用 Mojo::UserAgent 的简单示例&#xff1a; use Mojo::UserAgent;创建一个 Mojo::UserAgent 对象…

[2016-2018]phpstudy的exp制作

[2016-2018]phpstudy的exp制作 用python的requests模块进行编写 修改请求数据包进行远程代码执行 import requests import base64 def remove_code_execute():try:url input("请输入要测试的网址:")cmd input("想要执行的命令:")cmd f"system({…

【Linux】Linux项目部署及更改访问端口号和jdk、tomcat、MySQL环境搭建的配置安装

目录 一、作用 二、配置 1、上传安装包 2、jdk 2.1、解压对应安装包 2.2、环境变量搭建 3、tomcat 3.1、解压对应安装包 3.2、启动 3.3、设置防火墙 3.4、设置开发端口 4、MySQL 三、后端部署 四、Linux部署项目 1、单体项目 五、修改端口访问 1、进入目录 2…

vue+elementUI 设置el-descriptions固定长度并对齐

问题描述 对于elementUI组件&#xff0c;el-descriptions 在以类似列表的形式排列的时候&#xff0c;上下无法对齐的问题。 问题解决 在el-descriptions 标签中&#xff0c;添加属性&#xff1a; :contentStyle"content_style" 控制其内容栏长度 <el-descripti…

thinkphp6 入门(11)-- 模板标签

新版框架默认只能支持PHP原生模板&#xff0c;如果需要使用thinkTemplate模板引擎&#xff0c;需要安装think-view扩展&#xff08;该扩展会自动安装think-template依赖库&#xff09;。 composer require topthink/think-view配置文件 安装完成后&#xff0c;在配置目录的vi…

stm32 ADC

目录 简介 stm32的adc 框图 ①电压输入范围 ②输入通道 ​编辑③ADC通道 ④ADC触发 ⑤ADC中断 ⑥ADC数据 ⑦ADC时钟 ADC的四种转换模式 hal库代码 标准库代码 简介 自然界的信号几乎都是模拟信号&#xff0c;比如光亮、温度、压力、声音&#xff0c;而为了方便存储、…

C++之回调函数使用和不使用using、typedef、function定义总结(二百五十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Ardupilot开源飞控之Wiki修改操作

Ardupilot开源飞控之Wiki修改操作 1. 源由2. 页面编辑修改2.1 Step 1: 申请Github账号2.2 Step 2: 选择修改页面2.3 Step 3: 修改页面内容2.4 Step 4: 提交修改2.5 Step 5: 新增PR 3. 增删页面修改3.1 Step 1: 克隆本地的Ardupilot Wiki3.2 Step 2: 搭建本地验证环境3.3 Step 3…

Device /dev/sdc excluded by a filter ?

如何解决报错&#xff1a;Device /dev/sdc excluded by a filter $ lsblk -d -o name,rota NAME ROTA sda 1 sdb 1 sdc 1 sr0 1$ grep ^ /sys/block/*/queue/rotational /sys/block/sda/queue/rotational:1 /sys/block/sdb/queue/rotational:1 /sys/block/sd…

华为OD机试 - 寻找身高相近的小朋友 - 双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

React Hooks之useContext使用

官方文档写道&#xff1a;在组件的顶层调用 useContext 来读取和订阅 context。 我理解就是一个“全局变量”的概念。它可以用来声明一个变量&#xff0c;然后在各个组件中使用&#xff0c;避免了props一级一级往下传&#xff0c;当然使用场景有限&#xff0c;比如设置一个主题…

强缓存和协商缓存

视频&#xff1a;2022经典前端面试题&#xff1a;浏览器缓存、http缓存、强制缓存、协商缓存_哔哩哔哩_bilibili 文件:【建议收藏】45000字前端面试题及答案汇总&#xff0c;前端八股文 - 知乎 (zhihu.com)

npx 和 npm 区别

文章目录 背景作用执行流程 背景 解决 npm 之前的执行包中的命令行需要先下载的问题&#xff0c;如果有多个不同版本的包就需要下载多次比如已经装了全局的 webpack 1.x 版本并且还要继续使用&#xff0c;还需要装个 webpack 4.x 使用的其相应功能,这个时候可以不装在全局&…

git合并冲入===、<<<、>>>含义

在 Git 中&#xff0c;<<<<<<< HEAD, , 和 >>>>>>> 是用来标记代码冲突的特殊标记。 当你在进行 Git 合并或拉取操作时&#xff0c;如果存在不同分支上的相同文件的修改冲突&#xff0c;Git 会将这些冲突标记为如下的形式&#xff…

执行npm install时老是安装不成功node-sass的原因和解决方案

相信你安装前端项目所需要的依赖包&#xff08;npm install 或 yarn install&#xff09;时&#xff0c;有可能会出现如下报错&#xff1a; D:\code\**project > yarn install ... [4/4] Building fresh packages... [-/6] ⠁ waiting... [-/6] ⠂ waiting... [-/6] ⠂ wai…