模板方法(TemolateMethod)
1.重复=易错+难改。试卷类一个 ,学生的抄的考卷继承试卷类,唯一不同的是答案。
2.用了继承要让继承有意义,让所有重复的代码都上升到父类去,而不是让每个子类都重复。
3.何时使用:当我们要完成在某一细节层次一致的一个过程或者一系列步骤,但个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板模式来处理。
模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类之中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
UML结构图
C++代码实现
#include <iostream>
using namespace std;
class Base {
public:
virtual void fun1() {} //一些抽象行为,具体的放到子类去实现
virtual void fun2() {} // 一定要加定义,哪怕为空
virtual void callFun() // 模板方法,给出了逻辑的框架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类实现。
{
fun1();
fun2();
}
};
class Son1 :public Base { //实现父类所定义的一个或者多个抽象方法
public:
void fun1() {
cout << "类A 方法1的实现" << endl;
}
void fun2() {
cout << "类A 方法2的实现" << endl;
}
};
class Son2 :public Base {
public:
void fun1() {
cout << "类B 方法1的实现" << endl;
}
void fun2() {
cout << "类B 方法2的实现" << endl;
}
};
int main()
{
std::cout << "Hello World!\n";
Base* a = new Son1;
a->callFun();
}
优点:模板方法通过把不变的行为搬移到超类,去除了子类中重复的代码来体现它的优势。
模板方法模式提供了一个很好的代码复用平台。有时候遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的,但有些步骤的实现可能不同,这时候可以使用模板方法模式。
当不变的和可变的行为在方法的子类实现中混合在一起时,不变得行为就会在子类中重复出现。我们通过模板方法模式将这些行为搬移到单一得地方,这样就帮助子类摆脱重复不变得行为得纠缠。