模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式
介绍
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
该模式的主要缺点如下。
- AbstractClass:抽象类的父类
- ConcreteClass:具体的实现子类
- templateMethod():模板方法
- method1()与method2():具体步骤方法
-
模式的定义与特点
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
该模式的主要优点如下。 - 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
- 它在父类中提取了公共的部分代码,便于代码复用。
- 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
- 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
应用场景
这么看来,模板就是定义一个框架,比如盖房子,我们定义一个模板:房子要封闭,有门,有窗等等,但是要什么样的门,什么样的窗,这些并不在模板中描述,这个交给子类来完善,比如门使用防盗门,窗使用北向的窗等等
#include <iostream>
using namespace std;
class MakeCar
{
public:
virtual void MakeHead() = 0;
virtual void MakeBody() = 0;
virtual void MakeTail() = 0;
public:
void Make() //模板函数 把业务逻辑给做好
{
MakeTail();
MakeBody();
MakeHead();
}
};
class Jeep : public MakeCar
{
public:
virtual void MakeHead()
{
cout << "jeep head" << endl;
}
virtual void MakeBody()
{
cout << "jeep body" << endl;
}
virtual void MakeTail()
{
cout << "jeep tail" << endl;
}
};
class Bus : public MakeCar
{
public:
virtual void MakeHead()
{
cout << "Bus head" << endl;
}
virtual void MakeBody()
{
cout << "Bus body" << endl;
}
virtual void MakeTail()
{
cout << "Bus tail" << endl;
}
};
void main()
{
MakeCar *car = new Bus;
car->Make();
delete car;
MakeCar *car2 = new Jeep;
car2->Make();
delete car2;
system("pause");
return;
}