C++11 设计模式1. 模板方法(Template Method)模式学习。UML图

news2025/6/23 9:40:11

一 什么是 "模板方法(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)模式"的扩展

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

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

相关文章

Hive的分区与排序

一、Hive分区 1.引入&#xff1a; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff…

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…

实战项目——智慧社区(二)之 物业管理

分页 用于分页封装的实体类 Data public class PageVO {private Long totalCount;private Long pageSize;private Long totalPage;private Long currPage;private List list; }分页的相关配置 package com.qcby.community.configuration;import com.baomidou.mybatisplus.e…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…

物联网实验

实验1 基于ZStack光敏传感器实验 1.实验目的 我们通过上位机发指令给协调器&#xff0c;协调器把串口接收到的指令通过Zigbee协议无线发送给带有光敏传感器的终端节点&#xff0c;获取到数据以后把数据返回给上位机&#xff0c;实现无线获取数据的目的。 2.实验设备 硬件&a…

Vue2和Vue3组件通信:父子与兄弟间的桥梁

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Chatgpt掘金之旅—有爱AI商业实战篇|在线辅导业务|(十三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业播客剧本写作服务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。…

分类模型绘制决策边界、过拟合、评价指标

文章目录 1、线性逻辑回归决策边界1.2、使用自定义函数绘制决策边界1.3、三分类的决策边界1.4、多项式逻辑回归决策边界 2、过拟合和欠拟合2.2、欠拟合2.3、过拟合 3、学习曲线4、交叉验证5、泛化能力6、混淆矩阵7、PR曲线和ROC曲线 x2可以用x1来表示 1、线性逻辑回归决策边界 …

TQ15EG开发板教程:在MPSOC上运行ADRV9009

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件我都会放在网盘里面&#xff0c; 地址放在最后面。在github搜索hdl选择第一个&#xff0c;如下图所示 GitHub网址&#xff1a;https://github.com/analogdevicesinc/hdl/releases 点击releases选择版…

Vue 读取后台二进制文件流转为图片显示

Vue 读取后台二进制文件流转为图片显示 后台返回格式 <img :src"payImg" id"image" style"width: 150px;height: 150px;" alt"">axios写法 重点 responseType: ‘blob’ &#xff0c; 使用的是res中的data blob this.$axios.…

科学计算最新成果!基于多分支物理信息深度算子神经网络的快速通用热仿真模型...

热仿真在各个领域中起着至关重要的作用&#xff0c;通常涉及复杂的偏微分方程&#xff08;PDE&#xff09;仿真以进行热优化。为了解决通过传统方法求解复杂的偏微分方程所面临的挑战&#xff0c;我们利用神经网络进行热预测&#xff0c;尤其是采用深度神经网络作为PDE的通用求…

HTML5学习记录

简介 超文本标记语言&#xff08;HyperText Markup Language&#xff0c;简称HTML&#xff09;&#xff0c;是一种用于创建网页的标准标记语言。 编辑器 下载传送门https://code.visualstudio.com/ 下载编辑器插件 标题 标题通过 <h1> - <h6> 标签进行定义。 …

花样鼠标悬停特效

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&…

头歌-机器学习 第9次实验 随机森林

第1关&#xff1a;Bagging 任务描述 本关任务&#xff1a;补充 python 代码&#xff0c;完成 BaggingClassifier 类中的 fit 和 predict 函数。请不要修改 Begin-End 段之外的代码。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 什么是 Bagging&#xf…

python 有哪些函数

Python内置的函数及其用法。为了方便记忆&#xff0c;已经有很多开发者将这些内置函数进行了如下分类&#xff1a; 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) …

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…

功能测试_验证两个两位数整数边界数据的求和_边界值分析法

验证两个两位数整数边界数据的求和 上点&#xff1a;刚好等于边界的值 &#xff08;取值不考虑开闭区间&#xff09; 离点&#xff1a;刚好小于/大于边界上的值 &#xff08;取值类型看需求&#xff09; 内点&#xff1a;边界范围内的任何取值 &#xff08;取中间的值&#…

2024年 前端JavaScript 进阶 第4天 End 笔记

4.1-内容和浅拷贝 4.2-递归函数 4.3-深拷贝实现 4.4-利用lodash和JSON实现深 4.5-异常处理-throw和try、catch 4.6-普通函数和箭头函数的this 4.7-call方法改变this指向 4.8-apply方法 4.9-bind方法以及总结 4.10-什么是防抖以及底层实现 4.11-什么是节流以及底层实现 4.12-节流…

【教学类-50-07】20240411“数一数”图片中四种图形出现的数量随机或固定

背景需求 今天孩子们点数时&#xff0c;我核对答案&#xff0c;突然发现有两张图片上的三角、正方、椭圆、圆形只有1个&#xff0c;我感觉这个随机的概率有问题。 仔细点数后发现以下代码生成的几何图形数量是相同的 &#xff08;如果三角有3个&#xff0c;那么正方形、圆形…

LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回

背景描述 这一节内容比较复杂&#xff1a; 涉及到使用工具进行百科的检索&#xff08;有现成的插件&#xff09;有AgentExecutor来帮助我们执行后续由于上下文过大&#xff0c; 我们通过计算num_tokens&#xff0c;来控制我们的上下文 安装依赖 pip install --upgrade --qu…