借助抽象类定义算法的骨架,再由具体子类实现算法的特定步骤。这种设计模式让算法的整体结构得以固定,同时又能让不同的子类灵活地实现具体步骤;
简单来说就是使用抽象类,把要实现的功能框架写好,里面的具体实现细节设置为虚函数;
首先我们要知道什么是抽象类,抽象类就是还有纯虚函数的类就叫做抽象类,抽象类是不可以实例化的,这也是抽象类作为模版的重要原因;
我们在抽象类中定义的纯虚函数,后面再继承的派生类中都是需要进行重写的,这算是模版方法的使用方法;
这里我以一个游戏中常见的角色类为例;
#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;
//战士
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的虚函数;
int main()
{
Factor* factorBarrir = new Barrir(500, 0, 200);
factorBarrir->Burn();
}
但是我们知道法师一般是有蓝条的,释放技能一般都是耗蓝的,所以法师类Burn我们规定对自己不掉血,掉魔法值;
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;//攻击力
};
结合上面的战士,测试一下:
#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;
}