模板模式
模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
当多个类有相同的方法,并且逻辑相同,只是细节上有差异时,可以考虑使用模板模式。具体的实现上可以将相同的核心算法设计为模板方法,具体的实现细节有子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
举例:以生产电脑为例,电脑生产的过程都是一样的,只是一些装配的器件可能不同而已,我们都知道生产电脑需要Cpu、内存、显卡等待,但是Cpu、内存、显卡的型号显然是可以各不相同的,所以我们可以在电脑基类中定义安装Cpu、内存、显卡等待的虚函数,每当我们需要一台不同型号的电脑,就重新写一个子类,重写这些虚函数
关键代码:
- 模板方法:在抽象父类中定义,调用抽象方法和具体方法。
- 抽象方法:由子类实现,代表算法的可变部分。
- 具体方法:在抽象父类中实现,代表算法的不变部分。
#include<iostream>
using namespace std;
class Computer
{
public:
void product()
{
installCpu();
installRam();
installGraphicsCard();
}
protected:
virtual void installCpu() = 0;
virtual void installRam() = 0;
virtual void installGraphicsCard() = 0;
};
class ComputerA :public Computer
{
protected:
virtual void installCpu() override
{
cout << "ComputerA install Cpu Core i7" << endl;
}
virtual void installRam() override
{
cout << "ComputerA install 16G Ram" << endl;
}
virtual void installGraphicsCard() override
{
cout << "ComputerA install RTX3070 GraphicsCard" << endl;
}
};
class ComputerB :public Computer
{
protected:
virtual void installCpu() override
{
cout << "ComputerB install Cpu Core i9" << endl;
}
virtual void installRam() override
{
cout << "ComputerB install 64G Ram" << endl;
}
virtual void installGraphicsCard() override
{
cout << "ComputerB install RTX4090 GraphicsCard" << endl;
}
};
int main()
{
ComputerA* ca = new ComputerA();
ca->product();
ComputerB* cb = new ComputerB();
cb->product();
delete cb;
cb = nullptr;
delete ca;
ca = nullptr;
return 0;
}
运行结果如下