模板方法
模板方法模式,常常使用在框架(库)的设计中;
程序的执行流程是稳定的,但是具体的执行步骤是可变的
例如:
- 在QWidget框架中,Qt框架有一套自己的绘制流程, 在合适的时候,会去调用QWidget的paintEvent() 函数,但是具体paintEvent() 函数是怎样绘制,Qt框架并不关心,这就是一个典型的模板方法
稳定的是QWidget框架的执行流程,变化的是 paintEvent() 函数的具体实现
示例代码:
Class Library
{
public:
void run()
{
setp1();
if (step2())
{
step3();
}
for (int i = 0; i < 10; ++i)
{
step4();
}
step5();
}
private:
bool setp1(){ //todo }
void step3(){ //todo }
void step5(){ //todo }
protected:
bool setp2() = 0;
void step4() = 0;
}
class Application : public Library
{
protected:
bool step2() override { //todo }
void step4() override { //todo }
}
int main
{
Library* lib = new Application();
lib->run();
}
这里稳定的是run() 方法中的执行流程,不管是Application 还是 Application2,或是任意一个子类,都是先执行 step1(),然后判断 step2(),根据结果执行step3(), 最后再执行setp4() 和 step5();
所以可以将这个稳定的流程封装在基类中,将变化开放给子类去动态实现;此为Template Method
例如上述例子中的QWidget,将整个绘制流程封装在库中,Qt会在合适的时机来调用paintEvent() 进行绘制,至于具体这个绘制方法中怎样实现,是动态变化的,这一块变化的部分交不同子类运行时实现
我们平时遇到的 注册回调函数
的机制,也可以理解为一种模板方法,也是底层框架代码中包含固定的执行流程(稳定),将变化的部分,使用回调函数的形式,由应用层注册而来,在运行时候动态可变
工作中的运用
ICommand类
这里 ICommand的execute()方法中,执行的流程是稳定的,都是先做具体动作(doCommand()),再判断是否需要存储配置(needUpdateConfig()),最后执行配置的存储动作