一、模板模式
定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
实现方案:将算法/逻辑框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。
二、模式结构
角色
AbstractClass(抽象类):定义或声明了一系列基本操作method,这些操作可以是具体也可以是抽象的,每一个操作都对应算法的一个步骤,在其派生类(子类)中可以重定义。抽象类中定义一个用于定义一个算法的流程框架的方法。
ConcreteClass(派生类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
类图:
三、示例
#include<iostream>
#include<string>
#include <map>
using namespace std;
class MakeCar
{
protected:
virtual void makehead() = 0;
virtual void makebody() = 0;
virtual void maketail() = 0;
public:
void MakeNewCar()
{
makehead();
makebody();
maketail();
}
};
class MakeCar_BYD:public MakeCar
{
public:
void makehead() override final
{
cout << "BYD的车头!\n";
}
void makebody() override final
{
cout << "BYD的车身!\n";
}
void maketail() override final
{
cout << "BYD的车尾!\n";
}
};
class MakeCar_Jeep :public MakeCar
{
public:
void makehead() override final
{
cout << "Jeep的车头!\n";
}
void makebody() override final
{
cout << "Jeep的车身!\n";
}
void maketail() override final
{
cout << "Jeep的车尾!\n";
}
};
void main()
{
cout << "**************制造BYD********************\n";
MakeCar *m_byd = new MakeCar_BYD();
m_byd->MakeNewCar();
delete m_byd;
cout << "**************制造Jeep********************\n";
MakeCar *m_jeep = new MakeCar_Jeep();
m_jeep->MakeNewCar();
delete m_jeep;
system("pause");
}
结果: