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)模式"的扩展

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vivado 调试核时钟设置指南

调试核时钟设置指南 注释 &#xff1a; 以下章节适用于 7 系列、 UltraScale 和 UltraScale 器件。 Versal 调试核使用基于 AXI 的连接 &#xff0c; 且不受本章中的 时钟设置指南的约束。 Vivado 硬件管理器使用 JTAG 接口来与 Vivado Debug Hub 核进行通信 &#…

Spring Boot统一功能处理之拦截器

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求&#xff08;doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口&#xff0c;通常会安排几个…

Linux查看系统配置信息的命令【lscpu】【free】【df】【uname】【lsblk】【top】

目录 1.查看CPU信息【lscpu】 2.查看内存信息【free】 3.查看文件系统信息【df】 4.查看系统信息【uname】 知识扩展&#xff1a;Red Hat Enterprise Linux 和 Debian GNU/Linux 两者的发展介绍 知识扩展&#xff1a;Centos 和 ubuntu的区别 知识扩展&#xff1a;更多 …

Navicat的详细下载步骤

第一步&#xff0c;打开百度&#xff0c;找到Navicat官网 第二步&#xff0c;点击产品然后进去 第三步&#xff0c;点击直接下载然后跟着步骤来就OK啦

idm线程越多越好吗 idm线程数多少合适 IDM百度云下载 IDM下载器如何修改线程数

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的网络下载器&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM线…

免费搭建MC服务器(Minecraft免费开服教程)

我的世界(MC)作为一款全球热门的沙盒游戏&#xff0c;以其独特的创造性和无限的想象力&#xff0c;吸引了无数玩家。自行搭建MC服务器能够获得更好的游戏体验&#xff0c;本文将为大家介绍如何免费搭建MC服务器&#xff0c;开启一段属于自己的游戏世界之旅。 搭建MC服务器我们需…

ES11-12

1-ES11-Promise.allSettled Promise.allSettled0)方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。 简单来说不管成功失败都会调用.then()&#xff0c;然后处理成功和失败的结果 const promises [ …

头歌机器学习实验 第7次实验 局部加权线性回归

任务描述 本关任务&#xff1a;编写一个利用局部加权计算回归系数的小程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.局部加权算法的思想&#xff1b;2.局部加权的核心算法。 局部加权算法的思想 在局部加权算法中 &#xff0c;我们给待预测点附近…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

SpringBoot删除菜品模块开发(SpringMVC分割参数、事务管理、异常处理、批量删除)

需求分析与设计 一&#xff1a;产品原型 在菜品列表页面&#xff0c;每个菜品后面对应的操作分别为修改、删除、停售&#xff0c;可通过删除功能完成对菜品及相关的数据进行删除。 删除菜品原型&#xff1a; 业务规则&#xff1a; 可以一次删除一个菜品&#xff0c;也可以批…

NzN的数据结构--选择排序

接上文&#xff0c;本章我们来介绍选择排序。先三连后看才是好习惯~~~ 目录 一、基本思想 二、直接选择排序 三、堆排序 一、基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待…

2024/4/6—力扣—简化路径

代码实现&#xff1a; // 分割/得到名字 char **split(const char *s, int *returnSize) {int n strlen(s);char **ans (char **)malloc(sizeof(char *) * n);int l 0, r 0, len 0;while (r < n) {while (r < n && s[r] /) {r;}l r;while (r < n &…

报修小程序怎么建立?维修服务行业的智能化升级

在这个数字化飞速发展的时代&#xff0c;维修服务行业也在经历着前所未有的变革。消费者对于服务的期待不再局限于传统的电话预约或线下等待&#xff0c;而是希望能够通过更加智能、便捷的途径解决日常生活中的维修问题。在这样的背景下&#xff0c;报修小程序应运而生&#xf…

跟TED演讲学英文:A new way to build AI, openly by Percy Liang

A new way to build AI, openly Link: https://www.ted.com/talks/percy_liang_a_new_way_to_build_ai_openly? Speaker: Percy Liang Date: October 2023 文章目录 A new way to build AI, openlyIntroductionVocabularyTranscriptSummary后记 Introduction Today’s AI …

STM32F4 IAP跳转APP问题及STM32基于Ymodem协议IAP升级笔记

STM32F4 IAP 跳转 APP问题 ST官网IAP例程Chapter1 STM32F4 IAP 跳转 APP问题1. 概念2. 程序2.1 Bootloader 程序 问题现象2.2. APP程序 3. 代码4. 其他问题 Chapter2 STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxxChapter3 STM32基于Y…

信息系统项目管理师——第5章信息系统工程(三)

近几期的考情来看&#xff0c;本章选择题稳定考4分&#xff0c;考案例的可能性有&#xff0c;需要重点学习。本章节专业知识点特别多。但是&#xff0c;只考课本原话&#xff0c;大家一定要把本章至少通读一遍&#xff0c;还要多刷题&#xff0c;巩固重点知识。 3 系统集成 3…

Qt5 编译 Qt Creator 源码中的 linguist 模块

文章目录 下载 Qt Creator 源码手动翻译多语言自动翻译多语言 下载 Qt Creator 源码 Github: https://github.com/qt/qttools 笔记打算用 Qt 5.12.12 来编译 qt creator-linguist 所以笔者下载的是 tag - 5.12.12 &#xff0c;解压后如下&#xff0c;先删除多余的文件&#xf…

30岁《爱·回家》小花多次得罪高层,正式宣布离巢TVB。

30岁的苏韵姿&#xff08;Andrea&#xff09;16年选港姐入行&#xff0c;虽然无三甲名次&#xff0c;但靠着皇后大学戏剧学士学位背景&#xff0c;她很快已有机会入剧组&#xff0c;凭《爱回家之开心速递》熊心如&#xff08;红衫鱼&#xff09;一角成功入屋&#xff0c;不过去…

先进电机技术 —— 步进电机控制综述

一、背景 随着自动化技术的发展和精密控制需求的增长&#xff0c;步进电机作为一种重要的执行元件在众多领域展现出了卓越的性能优势。步进电机&#xff0c;又称为步进驱动器或步进马达&#xff0c;是一种能够将电脉冲信号精确转换为角位移或直线位移的特殊电动机。其工作原理…

防止狗上沙发,写一个浏览器实时识别目标检测功能

家里有一条狗&#x1f436;&#xff0c;很喜欢乘人不备睡沙发&#x1f6cb;️&#xff0c;恰好最近刚搬家 狗迎来了掉毛期 不想让沙发上很多毛。所以希望能识别到狗&#xff0c;然后播放“gun 下去”的音频&#x1f4e3;。 需求分析 需要一个摄像头&#x1f4f7; 利用 chrome…