博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式之禅读书笔记]010_23种设计模式四:模板方法模式
阅读量:7199 次
发布时间:2019-06-29

本文共 1504 字,大约阅读时间需要 5 分钟。

   序言

   昨天学习了抽象工厂模式,所谓的抽象工厂模式,是为了应对产品线升级和隔离平台差异使用的设计模式。具体请参照博主上一篇博客。

   今天要学习的是模板方法模式,可以说,这个模式太简单了,非常简单,你只需瞥一眼就能知道它的真谛,它的精髓。一言以蔽之。

 

   正文

   1. 定义

定义一个操作中的算法的框架,而将一些步骤延迟到子类,使得子类可以不改变现有算法的结构即可重定义该算法的某些特定步骤。

     用通俗的话来讲,举个例子,诸葛亮在指挥一场战役的时候,注意,是战役,战役是有很多场小战斗组成的。亮哥在谋划一场战役的时候,肯定是说:马谡,你守第一关;魏延,你守第二关;关羽,你守第三关;赵子龙,你守第四关。我们把马谡、魏延、关羽、赵子龙看作四个函数(这里稍微转化一下思维),可以看出来,亮哥没说:马谡啊,你守第一关的时候要在山下扎营,不要不听部下的话,千万不要跑到山上去。亮哥只是说:马谡,你去守第一关。也就是说,亮哥没有对马谡怎么去守第一关进行详细的安排,用计算机术语,这叫没实现马谡这个方法。同理,魏延,关羽,赵子龙也都是没有实现的方法。

     那亮哥的这个安排叫什么呢?我们叫做算法。算法是由很多小的步骤组成的,有严格的执行过程,你关羽不能说:马谡,你不行,我来守第一关,看我一下干死千八百人。所有的“算法”都是亮哥事先安排好的。这里就引出了模板方法的核心了,定义操作中的算法的框架,而将一些步骤延迟到子类,亮哥先不跟你说每一关怎么细守,而让大将们自己安排,反正你要打赢,怎么打赢,我就不管了。

   2. 代码实现

     下面看一段很简短的,能说明这个模式的代码片段吧:

1 #include 
2 using namespace std; 3 4 class Father{ 5 public: 6 virtual void masu(){} // 算法步骤1 7 virtual void weiyan(){} // 算法步骤2 8 virtual void guanyu(){} // 算法步骤3 9 virtual void zhaozilong(){} // 算法步骤410 11 void fight(){ // 框架规定的算法流程12 masu();13 weiyan();14 guanyu();15 zhaozilong();16 }17 18 };19 20 class Son:public Father{21 void masu(){ cout<<"守第一关:上梁抽梯"<
fight();30 system("pause");31 return 0;32 }

    怎么样?很简单吧,是的,模板方法就是这么简单,只用到了类的继承,总之,很简单就是了。

 

   类图

    实在不想画这个类图,太简单了,但是为了练手,我们还是画一个看看吧!

     

 

   总结

   模板方法模式是一个很简单的模式,它的核心就是预先在父类封装算法的框架流程,至于每一步的细节要由子类来实现,如果其中每个细节如果算法效率太低,那就可以对单独的细节算法进行优化,这样的好处是“延迟实现”。

转载于:https://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/30/2747238.html

你可能感兴趣的文章
REST是新SOAP?
查看>>
Clojure 1.7引入Transducers,提高跨平台支持度
查看>>
C# 8中的默认接口方法
查看>>
JShell:Java REPL综合指南
查看>>
当编程语言掌握在企业手中,是生机还是危机?
查看>>
移动互联网下半场,iOS开发者如何“高薪”成长?
查看>>
WiFi万能钥匙万玉权:管理应该是“自下而上”
查看>>
avalon2.2.1的所有核心概念
查看>>
iOS开发使用半透明模糊效果方法整理
查看>>
判断一个图是否有环
查看>>
C语言,能开发什么?怎么去学习?
查看>>
C\C++控制台程序隐藏方法总结
查看>>
unity 组件添加与访问
查看>>
安防无战事:一场10213亿元的误会
查看>>
【WPF】代码触发Button点击事件
查看>>
接口、多态
查看>>
JPress v2.0-rc.8 发布,新增插件开发的代码生成器
查看>>
老外的个人网站原来是这样设计的:17个最佳范例给你灵感
查看>>
事件总线
查看>>
如何对第一个Vue.js组件进行单元测试 (下)
查看>>