首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式-模版方法

设计模式-模版方法

作者头像
啊QQQQQ
发布2025-04-09 09:02:38
发布2025-04-09 09:02:38
10500
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

什么是模版方法?

借助抽象类定义算法的骨架,再由具体子类实现算法的特定步骤。这种设计模式让算法的整体结构得以固定,同时又能让不同的子类灵活地实现具体步骤;

简单来说就是使用抽象类,把要实现的功能框架写好,里面的具体实现细节设置为虚函数;

怎么理解抽象类的算法骨架?

首先我们要知道什么是抽象类,抽象类就是还有纯虚函数的类就叫做抽象类,抽象类是不可以实例化的,这也是抽象类作为模版的重要原因;

我们在抽象类中定义的纯虚函数,后面再继承的派生类中都是需要进行重写的,这算是模版方法的使用方法;

Burn功能骨架

这里我以一个游戏中常见的角色类为例;

代码语言:javascript
代码运行次数:0
运行
复制
#include<bits/stdc++.h>
using namespace std;

//模版方法--抽象类
class Factor
{
public:
	void Burn()
	{
		cout << "进行燃烧攻击...." << endl;
		BurnSelf();
		BurnEnemy();
	}
private:
	virtual void BurnSelf() = 0;
	virtual void BurnEnemy() = 0;  
public:
	~Factor()
	{

	}
};

该Factor类就是抽象类,而Burn方法就是下面派生类对象都要使用的骨架,骨架是一样的,但是里面的内容是不一样的,不同的对象可以从过重写骨架中的接口和方法,实现不同的效果,这就是多态的应用!!!

战士类

以Factor类为模版类实现一个战士类,这里我们规定Burn骨架中对角色自己的效果是减少生命值300,对敌人:生命值减少_attack;

代码语言:javascript
代码运行次数:0
运行
复制
//战士
class Barrir:public Factor
{
public:
	Barrir(int HP,int blue,int attack)
		:_HP(HP),_magic(blue),_attack(attack)
	{
		cout << "=========战士=========" << endl;
		cout << "生命值: " << _HP << endl;
		cout << "魔法值: " << _magic << endl;    
		cout << "攻击力: " << _attack << endl;   
		cout << "======================" << endl;
	}
	~Barrir() = default; 
public:
	virtual void BurnSelf( ) override
	{
		cout << "自身生命值减少300" << endl; 
	}
	virtual void BurnEnemy()override
	{
		cout << "敌人生命值减少" << _attack<<endl;   
	}
private:
	int _HP;//血量
	int _magic;//魔法值
	int _attack;//攻击力
};

在该战士类中,我们必须要对基类的纯虚函数重写,这样一来,我们使用Factor* 的对象指向一块Barrir的内存空间,然后调用Burn骨架就是调用Barrir的虚函数;

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
	Factor* factorBarrir = new Barrir(500, 0, 200);
	factorBarrir->Burn();  
}

法师类

但是我们知道法师一般是有蓝条的,释放技能一般都是耗蓝的,所以法师类Burn我们规定对自己不掉血,掉魔法值;

代码语言:javascript
代码运行次数:0
运行
复制
class Magic:public Factor
{
public:
	Magic(int HP, int blue, int attack)
		:_HP(HP), _magic(blue), _attack(attack)
	{
		cout << "=========法师=========" << endl;
		cout << "生命值: " << _HP << endl;
		cout << "魔法值: " << _magic << endl;
		cout << "攻击力: " << _attack << endl;
		cout << "======================" << endl;
	}
public:
	virtual void BurnSelf()override
	{
		cout << "自身魔法减少200" << endl;
		
	}
	virtual void BurnEnemy()override
	{
		cout << "敌人生命减少" << _attack << endl;  
	}
private:
	int _HP;//血量
	int _magic;//魔法值
	int _attack;//攻击力
};

结合上面的战士,测试一下:

代码语言:javascript
代码运行次数:0
运行
复制
#include<bits/stdc++.h>
using namespace std;

//模版方法--抽象类
class Factor
{
public:
	void Burn()
	{
		cout << "进行燃烧攻击...." << endl;
		BurnSelf();
		BurnEnemy();
	}
private:
	virtual void BurnSelf() = 0;
	virtual void BurnEnemy() = 0;  
public:
	~Factor()
	{

	}
};


//战士
class Barrir:public Factor
{
public:
	Barrir(int HP,int blue,int attack)
		:_HP(HP),_magic(blue),_attack(attack)
	{
		cout << "=========战士=========" << endl;
		cout << "生命值: " << _HP << endl;
		cout << "魔法值: " << _magic << endl;    
		cout << "攻击力: " << _attack << endl;   
		cout << "======================" << endl;
	}
	~Barrir() = default; 
public:
	virtual void BurnSelf( ) override
	{
		cout << "自身生命值减少300" << endl; 
	}
	virtual void BurnEnemy()override
	{
		cout << "敌人生命值减少" << _attack<<endl;   
	}
private:
	int _HP;//血量
	int _magic;//魔法值
	int _attack;//攻击力
};



class Magic:public Factor
{
public:
	Magic(int HP, int blue, int attack)
		:_HP(HP), _magic(blue), _attack(attack)
	{
		cout << "=========法师=========" << endl;
		cout << "生命值: " << _HP << endl;
		cout << "魔法值: " << _magic << endl;
		cout << "攻击力: " << _attack << endl;
		cout << "======================" << endl;
	}
public:
	virtual void BurnSelf()override
	{
		cout << "自身魔法减少200" << endl;
		
	}
	virtual void BurnEnemy()override
	{
		cout << "敌人生命减少" << _attack << endl;  
	}
private:
	int _HP;//血量
	int _magic;//魔法值
	int _attack;//攻击力
};


int main()
{
	Factor* factorBarrir = new Barrir(500, 0, 200);
	factorBarrir->Burn();    
	cout << "-----------------------------------" << endl;       
	Factor* factorMagic = new Magic(500, 1000, 400);  
	factorMagic->Burn();       
	return 0;  
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是模版方法?
  • 怎么理解抽象类的算法骨架?
    • Burn功能骨架
  • 战士类
  • 法师类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档