1. 意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. 动机
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
专属学习链接:https://xxetb.xetslk.com/s/32bi94
3.示例
假设有一个应用,需要完成5个步骤,其中步骤1、3、5由库开发人员完成,而步骤2、4由应用开发人员完成。
如果使用结构化的程序设计,会以以下方式编写代码:
class Library {
public:
void step1();
void step3();
void step5();
};
class Application {
public:
bool step2();
void step4();
};
void main() {
Library lib;
Application app;
lib.step1();
if (app.step2()) {
lib.step3();
}
app.step4();
lib.step5();
}
在一些框架中,解决一个问题方式往往是不需要更改、稳定的,所以完全可以将整个流程固化到库中。
class Library {
protected:
void step1();
void step3();
void step5();
virtual bool step2();
virtual void step4();
public:
void run();
};
void Library::run() {
step1();
if (step2()) {
step3();
}
step4();
step5();
}
class Application : Library {
protected:
bool step2() override;
void step4() override;
};
void main() {
Library *pLib = new Application;
pLib->run();
}
4. 结构
5.定义
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。
6.要点总结
Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为 protected 方法。