一、定义

  百度百科给的定义:定义一个操作中的算法骨架(稳定),而将一些步骤延迟到子类中(变化)。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  如何做到将一些步骤延迟到子类中?就是用虚函数,子类进行实现。

  说白了,就是把主程序写到父类文件中,部分子程序写到子类文件中,达到了算法可以灵活变化,且本体不需要进行改变的效果。

二、为什么要用模板方法

  用代码说话:没使用模板方法前

//程序库开发人员
class Library
{ public:
void Step1(){
//...
} void Step3(){
//...
} void Step5(){
//...
}
} //应用程序开发人员
class Application
{ public:
bool Step2(){
//...
} void Step4(){
//...
}
} int main()
{
Library lib();
Application app(); //算法主体代码
lib.Step1(); if(app.Step2())
{
lib.Step3();
} for(int i=; i<; i++)
{
app.Step4();
} app.Step5();
}

  很简单的代码,这段代码不一定是分开两个人来写,也有可能是同一个写或多个人来写,这里无所谓。

  一般来说,程序库开发人员的代码写的比较早,这些代码是稳定的,不会进行改变的。而应用程序开发人员的代码写的比较晚,这些代码是随需求变化而变化的。

  一般来说,算法主体代码也是稳定的,不会变的。但如果由应用程序开发人员来写,一,他需要懂这个算法具体如何实现,且能正确的写出来;二,如果多个地方用到了这个算法,岂不是要写这个算法很多次?代码复用率低。

  然后我们来看下使用模板方法后的代码:

//程序库开发人员
class Library
{ public: void Run(){
//算法主体代码
Step1(); if(Step2())
{
Step3();
} for(int i=; i<; i++)
{
Step4();
} Step5();
} virtual ~Library(){}//虚析构函数 protected: void Step1(){ //稳定
//...
} void Step3(){ //稳定
//...
} void Step5(){ //稳定
//...
} virtual bool Step2() = ; //变化
virtual void Step4() = ; //变化
} //应用程序开发人员
class Application
{ public:
virtual bool Step2(){
//子类重实现变化部分
} virtual void Step4(){
//子类重实现变化部分
}
} int main()
{
Library* lib = new Application();
lib.Run(); delete lib;
}

  使用了模板方法后,算法的实现是由程序库开发人员写的,他可以保证算法的正确性。后续想用此算法的人,只需根据需求重写一下变化部分,即可轻松调用,代码的复用性和准确性得到了保证。

参考视频:https://www.bilibili.com/video/av22292899/?p=3(PS: B站真是一个学习的好地方>_<!)

最新文章

  1. winform中的确定取消
  2. git-credential-winstore.exe&quot;: No such file or directory
  3. 解决:eclipse 非正常关闭,导致无法正常启动
  4. 【java消息格式化】使用MessageFormat进行消息格式化
  5. web服务器之nginx与apache
  6. ios Camera学习笔记
  7. js获取页面元素距离浏览器工作区顶端的距离
  8. r语言之散点图绘制及参数
  9. 基于visual Studio2013解决C语言竞赛题之1013字符串查找
  10. 1.4.2.5. 测试(Core Data 应用程序实践指南)
  11. hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
  12. 题解 P4093 【[HEOI2016/TJOI2016]序列】
  13. 阿里云oss,简单上传
  14. Spring Boot-右键maven build成功但是直接运行main方法出错的解决方案
  15. ngnix笔记
  16. [UGUI]滑动列表优化(循环利用)
  17. Kubernetes 初探
  18. android开发中的BaseAdapter之理解(引用自网络,总结的很好,谢谢)
  19. 【JavaScript】particle
  20. cloudstack 用admin 账号创建虚拟机只是提示insufficient resource

热门文章

  1. 代码规范mark一下
  2. 考研计算机复试(C语言复试笔试题)(精华题选)
  3. .NET--------枚举扩展方法(枚举转list,获取枚举描述)
  4. RabbitMQ 的安装----Linux环境
  5. jmeter测试计划元素执行顺序
  6. bootstrap-fileinput多图片上传
  7. 安装mavlink遇到的问题(future找不到)
  8. Linux 登陆配置读取顺序
  9. java+jenkins+testng+selenium+ant
  10. sql注入1