晚绑定机制:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景:
1.多个子类有公有的方法,且逻辑基本相同时;
2.重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;
3.重构时,把相同的代码提取到父类中,然后通过钩子函数约束其行为。
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class HummerModel {
public:
virtual void start() {}
virtual void stop() {}
virtual void alarm() {}
virtual void engineBoom() {}
virtual bool is_alarm() { //钩子方法,喇叭默认会响
return true;
}
virtual void run() final { //子类不可覆盖
start();
engineBoom();
if(is_alarm())
alarm();
stop();
}
};
class HummerH1Model :public HummerModel {
bool alarm_flag;
public:
void start() {
cout << "H1 start" << endl;
}
void stop() {
cout << "H1 stop" << endl;
}
void alarm() {
cout << "H1 alarm" << endl;
}
void engineBoom() {
cout << "H1 engineBoom" << endl;
}
bool is_alarm() { //喇叭默认不响 (重写了父类is_alarm方法)
return false;
}
};
class HummerH2Model :public HummerModel {
public:
void start() {
cout << "H2 start" << endl;
}
void stop() {
cout << "H2 stop" << endl;
}
void alarm() {
cout << "H2 alarm" << endl;
}
void engineBoom() {
cout << "H2 engineBoom" << endl;
}
};
int main()
{
HummerModel* h1 = new HummerH1Model;
HummerModel* h2 = new HummerH2Model;
h1->run();
cout << "-----------------------------" << endl;
h2->run();
return 0;
/*
输出:
H1 start
H1 engineBoom
H1 stop
----------------------------
H2 start
H2 engineBoom
H2 alarm
H2 stop
*/
}