模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类。模板方法模式使得子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤。
模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成
模板方法模式的结构图如下:
由上图可知,模板方法模式包含下面两个角色:
(1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
(2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
下面是运用模板方法模式写的代码:
#include <iostream>
using namespace std ;
class Teacher_question //老师提出来的问题
{
public:
void Question()
{
cout<<"1 动能修正系数是否与断面流速分布有关 2 临界雷诺数的大小与流体的性质无关 3 长短是指管道几何长度长的管道" ;
}
virtual void Answer()
{
}
};
class StudentA : public Teacher_question //学生A的作答
{
public:
void Answer()
{
cout<< " 对 错 对"<<endl ;
}
};
class StudentB : public Teacher_question //学生B的作答
{
public:
void Answer()
{
cout<< " 错 错 对"<<endl ;
}
};
int main()
{
cout<<"学生A的答案:" ;
Teacher_question * pStudentA = new StudentA ;
pStudentA->Answer() ;
cout<<"学生B的答案:" ;
Teacher_question * pStudentB = new StudentB ;
pStudentB->Answer() ;
return 0 ;
}
运行后: