菜鸟:大家伙儿常说的模板方法是什么?
码农:设计模式的经典名著中Design Patterns: Elements of Reusable Object-Oriented Software(《设计模式——可复用面向对象软件的基础》)提出的一种软件编码思想模式。
菜鸟:嗯...什么样的思想模式?
码农:生活中有炒过菜吗?
菜鸟:嗯...有...
码农:做空心菜是不是有个固定的步骤?
菜鸟:嗯...是的呀。
码农:是不是要起锅倒油,热锅烧油,加入备菜,翻炒,加入调料,菜品出锅。
菜鸟:是的...
码农:如果是炒油麦菜呢?是不是步骤一样,油加热程度不同,备菜不同,调料不同而已。
菜鸟:嗯..好像是...
码农:做菜是不是有固定的流程和做不同菜的具体细节差异。
菜鸟:这跟模板方法有什么关系?
码农:模板方法就是来解决这个问题的;将完成一件事情的稳定和变化独立开来,定义好一个操作的算法骨架(稳定),而将一些步骤延迟到具体场景中实现(变化);模板方法使得不同场景复用同一个算法框架,具体的场景重定义算法的某些特定步骤。
菜鸟:有点...明白...
码农:不明白没关系看下具体的代码例子
定义好稳定部分
代码语言:c 复制#include <iostream>
// 程序基础服务开发人员代码
class library {
public:
library(){}
virtual ~library(){}
// 定义并实现好稳定的三个步骤
void step1() {
//do something
std::cout << "library step1" << std::endl;
}
void step3() {
//do something
std::cout << "library step3" << std::endl;
}
void step5() {
//do something
std::cout << "library step5" << std::endl;
}
virtual bool step2() = 0; // 纯虚函数要求子类必须要实现,给子类预留扩展,应对变化
virtual bool step4() = 0; // 纯虚函数要求子类必须要实现,给子类预留扩展,应对变化
// 定义好算法框架
void run() {
step1();
if (step2()) {// 子类扩展变化
step3();
}
for (size_t i = 0; i < 5; i ) {
step4();// 子类扩展变化
}
step5();
}
};
实现变化部分
代码语言:javascript复制// 上层应用逻辑程序代码
class application : public library {
public:
application(){}
virtual ~application(){}
//重写父类方法 ,子类扩展变化
virtual bool step2() {
//do something
std::cout << "application step2" << std::endl;
return true;
}
//重写父类方法 ,子类扩展变化
virtual bool step4() {
//do something
std::cout << "application step4" << std::endl;
return true;
}
};
使用模板方法
代码语言:javascript复制int main()
{
//version 2
// 应用程序不需要实现程序执行流程,调用定义好的run流程即可
library* app = new application();
app->run();
delete app;
return 0;
}
菜鸟:看了代码我终于明白了。
码农:小伙子有前途颇具慧根。