C++11 设计模式1. 模板方法(Template Method)模式学习。UML图
一 什么是 "模板方法(Template Method)模式"
在固定步骤确定的情况下,通过多态机制在多个子类中对每个步骤的细节进行差异化实现,这就是模板方法模式能够达到的效果。
模板方法模式属于:行为型模式。
二 "模板方法(Template Method)模式"能解决什么样子的问题
在固定步骤确定的情况下。
通过多态机制在各个子类中实现每个步骤的具体细节。
举例:
2020年1月1号,A公司有一个小游戏项目组开始开发一款游戏——开发单机闯关打斗类游戏(类似街机打拳类游戏)。
游戏策划需求:游戏主角都是个战士(攻击力不够强,生命值比较多,抗揍),主角通过不断的往前走来闯关,遇到敌人就进行攻击,
主角:生命值——1000(为0时主角死亡,游戏结束),魔法值——0(暂时用不上,保留),攻击力——200(打敌人一下敌人失去多少点声明值) 三个属性。
//敌人也会反击,敌人也会距离近时主动攻击主角。
//主角:生命值——1000(为0时主角死亡,游戏结束),魔法值——0(暂时用不上,保留),攻击力——200(打敌人一下敌人失去多少点声明值) 三个属性。
//技能“燃烧”——使用该技能可以使附近所有敌人每人失去500点生命值,但是主角自身也会损失掉300点生命值。
2020年2月1号,游戏扩展,增加 法师 作为主角
//增加 法师 作为主角(攻击力很强,生命值比较少,不抗揍)
//主角:生命值——800,魔法值——200(暂时用不上,保留),攻击力——300 三个属性。
//技能“燃烧”——使用该技能可以使附近所有敌人每人失去650点生命值,但是主角自身会损失掉100点魔法值。
2020年3月1号,游戏扩展,增加牧师 作为主角
//增加 牧师 作为主角(攻击力很弱,生命值比较少,不抗揍)
//主角:生命值——300,魔法值——500(暂时用不上,保留),攻击力——200 三个属性。
//技能“燃烧”——使用该技能可以使附近所有敌人每人失去200点生命值,给自身英雄恢复200点生命值,但是主角自身会损失掉200点魔法值。
2020年4月1号, 还有扩展,5.1还有扩展。。。。
我们能知道的是:随着游戏的变化,我们应该怎么设计呢?我们和游戏策划讨论后,规定:后续不管有多少新加入的角色,他的技能都可以分为如下的几种,
1.对于敌人的影响
2.对于自己数值的影响(包括友军)
3.动画效果(在这里,假定只有一种动画,这里只是想处理没有 差别的具体的方法实现,实际开发过程中,每次打击的动画效果,都应该不一样才合理)
4.自身特殊的技能(例如节假日搞的一些活动)
由于技能攻击行为的每一个步骤都是确定的,那么 针对 这个攻击的行为,我们在这里使用 "模版方法"来完成
三 "模板方法(Template Method)模式"的一般实现
// 001templatemethod.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 模版方法模式
//战士主角:生命值——1000(为0时主角死亡,游戏结束),魔法值——0(暂时用不上,保留),攻击力——200(打敌人一下敌人失去多少点声明值) 三个属性。//技能“燃烧”——使用该技能可以使附近所有敌人每人失去500点生命值,但是主角自身也会损失掉300点生命值。//法师主角(攻击力很强,生命值比较少,不抗揍)//主角:生命值——800,魔法值——200(暂时用不上,保留),攻击力——300 三个属性。 //技能“燃烧”——使用该技能可以使附近所有敌人每人失去650点生命值,但是主角自身会损失掉100点魔法值。
//注意,在此程序中,我们只是用了 生命值,魔法值,和“燃烧”技能的参数,目的是为了学习 “模版方法”。#include <iostream>
#include <string>
#include <crtdbg.h>
using namespace std;//Hero 为父类,代表每个英雄的共同点
class Hero {public:Hero(string name,int left,int magic):m_name(name),m_left(left),m_magic(magic) {}virtual ~Hero() {}public://1.对于敌人的影响
// 2.对于自己数值的影响(包括友军)
// 3.动画效果(在这里,假定只有一种动画,这里只是想处理没有 差别的具体的方法实现,实际开发过程中,每次打击的动画效果,都应该不一样才合理)
// 4.自身特殊的技能(例如节假日搞的一些活动)void JNattack() {if (!canuseJN()) {return;}effortEnemy();effortSelf();animation_effects();selfCustomize();}private:virtual void effortEnemy()=0;virtual void effortSelf()=0;void animation_effects() {cout << "Hero's animation_effects" << endl;}virtual void selfCustomize()=0;virtual bool canuseJN()=0;protected:string m_name; //名字int m_left; //生命值int m_magic;// 蓝量
};//1.战士class zhanshiHero :public Hero {
public :zhanshiHero(string name, int left, int magic) :Hero(name, left, magic) {}private:virtual void effortEnemy() {cout << "zhanshiHero JNattack effortEnemy " << endl;}virtual void effortSelf() {cout << "zhanshiHero JNattack effortSelf left-200 " << endl;m_left -= 300;}virtual void selfCustomize() {cout << "zhanshiHero JNattack selfCustomize something " << endl;}virtual bool canuseJN() {if (this->m_left - 300 >= 0) {cout << "zhanshi 血量剩余: " << this->m_left << " 可以使用技能" << endl;return true;}else {cout << "zhanshi 血不够300,无法使用技能 血量剩余" <<this->m_left << endl;return false;}}
};//2.法师class fashiHero :public Hero {
public:fashiHero(string name, int left, int magic) :Hero(name, left, magic) {}private:virtual void effortEnemy() {cout << "fashiHero JNattack effortEnemy " << endl;}virtual void effortSelf() {cout << "fashiHero JNattack effortSelf magic-100 " << endl;m_magic -= 100;}virtual void selfCustomize() {cout << "fashiHero JNattack selfCustomize something " << endl;}virtual bool canuseJN() {if (this->m_magic - 100 >= 0) {cout << "fashi 蓝量剩余: " << this->m_magic << " 可以使用技能" << endl;return true;}else {cout << "fashi 蓝量剩余: " << this->m_magic << " 无法使用技能" << endl;return false;}}
};int main()
{std::cout << "Hello World!\n";zhanshiHero *pherozs = new zhanshiHero("zszhangsan", 1000, 0);Hero *pherofs = new fashiHero("fslisi", 800, 200);//Hero *pherofs1111111111 = new fashiHero("aaaa", 80880, 2800);pherozs->JNattack();pherozs->JNattack();pherozs->JNattack();pherozs->JNattack();pherozs->JNattack();cout << "----------------" << endl;pherofs->JNattack();pherofs->JNattack();pherofs->JNattack();cout << "---------******************-------" << endl;delete pherozs;delete pherofs;_CrtDumpMemoryLeaks();return 1;
}
四 "模板方法(Template Method)模式"的扩展
相关文章:
C++11 设计模式1. 模板方法(Template Method)模式学习。UML图
一 什么是 "模板方法(Template Method)模式" 在固定步骤确定的情况下,通过多态机制在多个子类中对每个步骤的细节进行差异化实现,这就是模板方法模式能够达到的效果。 模板方法模式属于:行为型模式。 二 &…...
HarmonyOS实战开发-自定义分享
介绍 自定义分享主要是发送方将文本,链接,图片三种类型分享给三方应用,同时能够在三方应用中展示。本示例使用数据请求 实现网络资源的获取,使用屏幕截屏 实现屏幕的截取,使用文件管理 实现对文件,文件目录的管理&…...
Spring源码刨析之配置文件的解析和bean的创建以及生命周期
public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…...
如何使用 Grafana 监控文件系统状态
当 JuiceFS 文件系统部署完成并投入生产环境,接下来就需要着手解决一个非常重要的问题 —— 如何实时监控它的运行状态?毕竟,它可能正在为关键的业务应用或容器工作负载提供持久化存储支持,任何小小的故障或性能下降都可能造成不利…...
智能革命:未来人工智能创业的天地
智能革命:未来人工智能创业的天地 一、引言 在这个数字化迅速变革的时代,人工智能(AI)已经从一个边缘科学发展成为推动未来经济和社会发展的关键动力。这一技术领域的飞速进步,不仅影响着科技行业的每一个角落,更是为创业者提供了…...
4月14日总结
java学习 一.多线程 简介:多线程是计算机科学中的一个重要概念,它允许程序同时执行多个任务或操作。在单个程序内部,多线程使得代码可以并行执行,从而提高程序的性能和响应速度。 这里先来介绍一下创建多线程的几种方法。 1.扩展…...
kafka---broker相关配置
一、Broker 相关配置 1、一般配置 broker.id 当前kafka服务的sid(server id),在kafka集群中,该值是唯一的(unique),如果未设置此值,kafka会自动生成一个int值;为了防止自动生成的值与用户设置…...
【Golang学习笔记】从零开始搭建一个Web框架(二)
文章目录 模块化路由前缀树路由 前情提示: 【Golang学习笔记】从零开始搭建一个Web框架(一)-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起,如果要实现路由功能的拓展增强,那将会非常麻烦&…...
高精度地图导航论文汇总
文章目录 2021基于车载激光点云的高精地图矢量化成图[J] 2022基于高精度地图的智能车辆路径规划与跟踪控制研究[M] 2023一种无人驾驶融合决策方案的设计与实现[M] 2021 基于车载激光点云的高精地图矢量化成图[J] 摘要: 针对车载激光点云中对各特征物提取结果后矢量…...
【域适应】基于域分离网络的MNIST数据10分类典型方法实现
关于 大规模数据收集和注释的成本通常使得将机器学习算法应用于新任务或数据集变得异常昂贵。规避这一成本的一种方法是在合成数据上训练模型,其中自动提供注释。尽管它们很有吸引力,但此类模型通常无法从合成图像推广到真实图像,因此需要域…...
从零实现诗词GPT大模型:pytorch框架介绍
专栏规划: https://qibin.blog.csdn.net/article/details/137728228 因为咱们本系列文章主要基于深度学习框架pytorch进行,所以在正式开始之前,现对pytorch框架进行一个简单的介绍,主要面对深度学习或者pytorch还不熟悉的朋友。 一、安装pytorch 这一步很简单,主要通过p…...
[目标检测] OCR: 文字检测、文字识别、text spotter
概述 OCR技术存在两个步骤:文字检测和文字识别,而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像,主要由合成图像,产品描述,网络广告(淘宝)MS…...
Windows环境下删除MySQL
文章目录 一、关闭MySQL服务1、winR打开运行,输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录(默认在C盘下的Program …...
uniapp:uview-plus的一些记录
customStyle 并不是所有的组件都有customStyle属性来设置自定义属性,有的还是需要通过::v-deep来修改内置样式 form表单 labelStyle 需要的是一个对象 :labelStyle"{color: #333333,fontSize: 32rpx,fontWeight: 500}"dateTimePicker选择器设置默认值…...
OLTP 与 OLAP 系统说明对比和大数据经典架构 Lambda 和 Kappa 说明对比——解读大数据架构(五)
文章目录 前言OLTP 和 OLAPSMP 和 MPPlambda 架构Kappa 架构 前言 本文我们将研究不同类型的大数据架构设计,将讨论 OLTP 和 OLAP 的系统设计,以及有效处理数据的策略包括 SMP 和 MPP 等概念。然后我们将了解经典的 Lambda 架构和 Kappa 架构。 OLTP …...
步骤大全:网站建设3个基本流程详解
一.领取一个免费域名和SSL证书,和CDN 1.打开网站链接:https://www.rainyun.com/z22_ 2.在网站主页上,您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册",然后选择"微信登录"选项。 4.使用您的…...
利用Sentinel解决雪崩问题(二)隔离和降级
前言: 虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了,不管是线程隔离还是熔断降级,都是对客户端(调…...
基于springboot的房产销售系统源码数据库
基于springboot的房产销售系统源码数据库 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产…...
【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)
基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究,但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在,给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…...
深圳晶彩智能ESP32-3248S035R使用LovyanGFX实现手写板
深圳晶彩智能ESP32-3248S035R介绍 深圳晶彩智能出品ESP32-3248S035R为3.5寸彩色屏采用分辨率480x320彩色液晶屏,驱动芯片是ST7796。板载乐鑫公司出品ESP-WROOM-32,Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏,驱动芯片是XPT2046。 Lo…...
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 Spring Boot 日志一. 日志的概念?…...
ISTQB选择国内版,还是国际版呢
1, ISTQB简介 ISTQB(International Software Testing Qualifications Board)是一个国际软件测试资格认证机构,旨在提供一个统一的软件测试认证标准。ISTQB成立于2002年,是非盈利性的组织,由世界各地的国家或地区软件测…...
头歌-机器学习 第11次实验 softmax回归
第1关:softmax回归原理 任务描述 本关任务:使用Python实现softmax函数。 相关知识 为了完成本关任务,你需要掌握:1.softmax回归原理,2.softmax函数。 softmax回归原理 与逻辑回归一样,softmax回归同样…...
Qt for MCUs 2.7正式发布
本文翻译自:Qt for MCUs 2.7 released 原文作者:Qt Group高级产品经理Yoann Lopes 翻译:Macsen Wang Qt for MCUs的新版本已发布,为Qt Quick Ultralite引擎带来了新功能,增加了更多MCU平台的支持,并且我们…...
共享IP和独享IP如何选择,两者有何区别?
有跨境用户在选择共享IP和独享IP时会有疑问,不知道该如何进行选择,共享IP和独享IP各有其特点和应用场景,选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较: 首先两者的主要区别在于使用方式和安全性:共…...
文心一言VSchatGPT4
文心一言和GPT-4各有优势,具体表现在不同的测试场景下。 在某些测试场景中心一言的表现优于GPT-4,例如在故事的完整度和情节吸引力方面,文心一言表现得更加符合指令,情节更吸引人。这可能得益于其模型在训练时对中文语境的深入理…...
Linux 目录结构与基础查看命令
介绍 目录结构如下 /bin:存放着用户最经常使用的二进制可执行命令,如cp、ls、cat等。这些命令是系统管理员和普通用户进行日常操作所必需的。 /boot:存放启动系统使用的一些核心文件,如引导加载器(bootstrap loader…...
【matlab】如何解决打开缓慢问题(如何让matlab在十几秒内打开)
【matlab】如何解决打开缓慢问题(如何让matlab在十几秒内打开) 找到我们解压缩时Crack中的license_standalone.lic文件,将其拷贝 在安装matlab的路径下新建一个文件,粘贴上面的license_standalone.lic文件 在桌面鼠标移动到matl…...
【stata】求滚动波动情况
0.计算对象 计算 t t t、 t 1 t1 t1、 t 2 t2 t2 这三起滚动波动情况 V o l i , t l n ( ∑ n t n t 2 ( g n − g ˉ ) 2 3 ) Vol_{i,t} ln(\sqrt{\frac{\sum_{nt}^{nt2}(g_{n}-\bar{g})^2}{3}}) Voli,tln(3∑ntnt2(gn−gˉ)2 ) e . g e.g e.g: 假设 200…...
The C programming language (second edition,KR) exercise(CHAPTER 2)
E x c e r c i s e 2 − 1 Excercise\quad 2-1 Excercise2−1:输出结果如图1和图2所示,这道练习题需要文章1和文章2的知识。 #include <stdio.h> #include <limits.h>float getFloat(char sign, unsigned char exp, unsigned mantissa); do…...
三河做网站/2345网址导航电脑版
1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, $("a") 选择所有<a>元素 .class 根据元素的css类选择 $(".bgRed") 选择所用CSS类为 bgRed的元素 * 选择所有元素 $…...
wordpress 标签 文章/附近的成人电脑培训班
今天线上业务遇到一个问题,因为一张模拟自增序列的表被锁住,涉及该表的业务受到影响。线上情况:1、这个表只有一个id字段。2、id字段为主键索引3、该表只有一行数据,记录全局最大id4、某业务存储过程操作会执行id1操作,…...
那些网站做汽车可靠性/站长之家ping检测
通过log打印出来的信息很快就一闪而过了,着实很郁闷。这里通过更改logcat的缓存数解决的,eclipse默认是5000,我将其改成了50000。 转载于:https://www.cnblogs.com/xiaofeng6636/p/4931913.html...
建设与管理局网站/sem竞价代运营
1.常用事件 onload:当页面中的所有的标签,文档,图片等资源加载完毕后会触发onload事件 onclick:鼠标单击事件 ondblclick:鼠标双击事件 onmousedown:鼠标按下事件 …...
如何做视频网站技术/网店运营推广方案
1.微服务 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力…...
syntax highlighter for wordpress/黑帽seo教程
毫无PS痕迹 你的第一本Photoshop书 目录 《毫无PS痕迹-你的本Photoshop书》全书分为四大部分: 第1、2章讲解色彩和图像的原理与基础知识要点。 第3至11章全面讲解了使用Photoshop进行各种设计创作的方法与技巧。这包括色彩调整工具的使用、极其重要的选区、蒙版与图…...