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

news/2024/7/2 1:25:54 标签: c++, 设计模式, 模板方法模式

一 什么是 "模板方法(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.niftyadmin.cn/n/5480963.html

相关文章

React 使用 three.js 加载 gltf 3D模型 | three.js 入门

系列文章 示例项目(gitcode)&#xff1a;https://gitcode.com/qq_41456316/simple-react-three-demo 文章目录 系列文章前言一、three.js是什么&#xff1f;二、使用 React 和 three.js 加载 glTF 3D 模型的步骤步骤 1&#xff1a;创建 React 应用步骤 2&#xff1a;安装 thre…

comfyui便携版(绿色版)安装CLIP报错no module named ‘CLIP‘

具体说来就是其中的ImageRewardFilter需要用到。 要求得有CLIP 我们一般装模块都通过 pip install xxx这样的命令来装&#xff0c; 具体到comfyui便携版的模块安装上&#xff0c;一般用的是 python -m pip install xxx这样的形式&#xff08;以模块化的形式安装到当前便携版的…

Objective-C学习笔记(基本语法)4.6

1.#import是#Include的增强版&#xff0c;同一个文件无论包含多少次&#xff0c;import只会包含一次。 2.框架&#xff1a;c语言的函数库&#xff0c;基础为Foundation。 3.autoreleasepool:自动释放池。 4.NSLog&#xff1a;print的增强&#xff0c;①增强了输出调试相关信…

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

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

SpringCloudAlibaba-整合sleuth和zipkin(六)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 一、整合sleuth 1.引入依赖 在需要追踪的微服务中引入依赖&#xff0c;user、order、product <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter…

Node.js 的 5 个常见服务器漏洞

Node.js 是一个强大且广泛使用的 JavaScript 运行时环境&#xff0c;用于构建服务器端应用程序。然而&#xff0c;与任何其他软件一样&#xff0c;Node.js 也有自己的一些漏洞&#xff0c;如果处理不当&#xff0c;可能会导致安全问题。请注意&#xff0c;这些漏洞并不是 Node.…

Harmony鸿蒙南向驱动开发-Regulator

Regulator模块用于控制系统中各类设备的电压/电流供应。在嵌入式系统&#xff08;尤其是手机&#xff09;中&#xff0c;控制耗电量很重要&#xff0c;直接影响到电池的续航时间。所以&#xff0c;如果系统中某一个模块暂时不需要使用&#xff0c;就可以通过Regulator关闭其电源…

ChatGPT在地学,自然科学等了领域应用教程

原文链接&#xff1a;ChatGPT在地学&#xff0c;自然科学等了领域应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600722&idx2&sn291ea8c935b1d9b1459170baa9057053&chksmfa820bb5cdf582a39086e5ee9596ab020784fa78ac7dc49ced4969e28817c3f0…