模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

钩子:是一种被声明在抽象类中的方法,但只是空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。
作用:子类实现算法的可选部分、子类可以对钩子不理会、子类可以对某些即将发生或刚刚发生的步骤做出反应(比如重新排序、新的赋值、显示等等)、子类为其抽象类做一些决定。
代码:
Template.h:
#pragma once
#include <iostream>
using namespace std;
class Template
{
public:
virtual void A() = 0;
virtual void B() = 0;
void templateMethod()
{
if(useA()) A();
if(useB()) B();
}
virtual bool useA()//钩子(是否调用A)
{
return true;
}
virtual bool useB()//钩子(是否调用B)
{
return true;
}
};
class Template1:public Template
{
virtual void A()
{
cout << "调用Template1的A方法" << endl;
}
virtual void B()
{
cout << "调用Template1的B方法" << endl;
}
virtual bool useA()
{
return false;
}
};
class Template2 :public Template
{
virtual void A()
{
cout << "调用Template2的A方法" << endl;
}
virtual void B()
{
cout << "调用Template2的B方法" << endl;
}
virtual bool useB()
{
return false;
}
};
class Template3 :public Template
{
virtual void A()
{
cout << "调用Template3的A方法" << endl;
}
virtual void B()
{
cout << "调用Template3的B方法" << endl;
}
};
main.cpp
#include <iostream>
#include "Template.h"
using namespace std;
int main()
{
Template1* t1 = new Template1;
Template2* t2 = new Template2;
Template3* t3 = new Template3;
t1->templateMethod();
t2->templateMethod();
t3->templateMethod();
return 0;
}
结果:

版权声明:本文为qq_40386321原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。