模板方法:
- 是对一系列的流程、生命周期等进行抽象,通过将早绑定转换为晚绑定,实现代码的稳定。
- 站在类库开发者的角度,即“不要调用我,让我来调用你”。类开发者先调用抽象的方法,具体的方法实现由调用者负责。调用者不用去选择性调用开发者写好的方法,调用者只管实现方法即可,无需关注流程。
- 比如UI窗体的生命周期,线程的生命周期等,流程是固定的,但是在各个生命周期的方法不一定,则可以将不固定的方法作为虚函数留给应用程序具体实现。
实现思路:
- 比如一个应用程序需要按步骤调用step1()、step2()、step3()、step4()、step5(),分别做一些处理,其中step1()、step3()、step5()是固定不变的,但是step2()、step4()根据不同的业务有不同的实现。
- 则可以将整个步骤抽象到框架中的run()方法,然后定义虚函数step2()、step4(),留给应用程序具体实现。将变化留给应用程序,稳定则在类中封装起来。
- 这样就实现了通过晚绑定,框架调用应用程序,而不是应用程序调用框架。
思考:
- 该模式中变化点是流程中可能不固定的某些方法,通过虚函数即可实现代码稳定。
class Library {
public:
virtual void step2() = 0; //变化点
virtual void step4() = 0; //变化点
void step1() { //稳定点
//do something
};
void step3() { //稳定点
//do something
};
void step5() { //稳定点
//do something
};
void run() { //稳定的流程,调用变化的step2,step3
//结构化编程里面,应该是在application里面调用library的step1\3\5方法顺序调用,但是这里把“稳定”的部分抽象出来了。
step1();
step2();
step3();
step4();
step5();
}
};
class Application :public Library {
void step2() {
//具体实现
}
void step4() {
//具体实现
}
};