软件构建过程中,对于某项任务,常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时出现。
- 定义一个操作中算法的骨架(稳定),而将一些步骤延迟(变化)到子类中
- Template Method 使得子类可以不改变(复用)一个算法的结构,即可重定义(override 重写)该算法的某些特定步骤
// 程序库开发人员
class Libary{
public:
void Step1(){
//...
}
void Step3(){
//...
}
void Step5(){
//...
}
};
// 应用程序开发人员
class Application{
public:
bool Step2(){
//...
}
void Step4(){
//...
}
};
int main()
{
Libary lib();
Application app();
lib.Step1();
if(app.Step2()){
lib.Step3();
}
for(int i = 0; i < 4; i++){
app.Step4();
}
lib.Step5();
}
// 程序库开发人员
class Libary{
public:
void Run(){
Step1();
if(Step2()){ // 支持变化 ==> 虚函数的多态调用
Step3();
}
for(int i = 0; i < 4; i++){
Step4(); // 支持变化 ==> 虚函数的多态调用
}
Step5();
}
virtual ~Libary(){ }
protected:
void Step1(){
//...
}
void Step3(){
//...
}
void Step5(){
//...
}
virtual bool Step2() = 0;
virtual void Step4() = 0;
};
// 应用程序开发人员
class Application : public Libary{
protected:
bool Step2() override {
//... 子类重写实现
}
void Step4() override {
//... 子类重写实现
}
};
int main()
{
Libary* pLib = new Application();
pLib->Run();
delete pLib;
}