[设计模式之禅读书笔记]010_23种设计模式四:模板方法模式
序言
昨天学习了抽象工厂模式,所谓的抽象工厂模式,是为了应对产品线升级和隔离平台差异使用的设计模式。具体请参照博主上一篇博客。
今天要学习的是模板方法模式,可以说,这个模式太简单了,非常简单,你只需瞥一眼就能知道它的真谛,它的精髓。一言以蔽之。
正文
1. 定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类,使得子类可以不改变现有算法的结构即可重定义该算法的某些特定步骤。
用通俗的话来讲,举个例子,诸葛亮在指挥一场战役的时候,注意,是战役,战役是有很多场小战斗组成的。亮哥在谋划一场战役的时候,肯定是说:马谡,你守第一关;魏延,你守第二关;关羽,你守第三关;赵子龙,你守第四关。我们把马谡、魏延、关羽、赵子龙看作四个函数(这里稍微转化一下思维),可以看出来,亮哥没说:马谡啊,你守第一关的时候要在山下扎营,不要不听部下的话,千万不要跑到山上去。亮哥只是说:马谡,你去守第一关。也就是说,亮哥没有对马谡怎么去守第一关进行详细的安排,用计算机术语,这叫没实现马谡这个方法。同理,魏延,关羽,赵子龙也都是没有实现的方法。
那亮哥的这个安排叫什么呢?我们叫做算法。算法是由很多小的步骤组成的,有严格的执行过程,你关羽不能说:马谡,你不行,我来守第一关,看我一下干死千八百人。所有的“算法”都是亮哥事先安排好的。这里就引出了模板方法的核心了,定义操作中的算法的框架,而将一些步骤延迟到子类,亮哥先不跟你说每一关怎么细守,而让大将们自己安排,反正你要打赢,怎么打赢,我就不管了。
2. 代码实现
下面看一段很简短的,能说明这个模式的代码片段吧:
1 #include <iostream> 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(){} // 算法步骤4 10 11 void fight(){ // 框架规定的算法流程 12 masu(); 13 weiyan(); 14 guanyu(); 15 zhaozilong(); 16 } 17 18 }; 19 20 class Son:public Father{ 21 void masu(){ cout<<"守第一关:上梁抽梯"<<endl; } 22 void weiyan(){ cout<<"守第二关:借刀杀人"<<endl; } 23 void guanyu(){ cout<<"守第三关:隔岸观火"<<endl; } 24 void zhaozilong(){ cout<<"守第四关:走为上计"<<endl; } 25 }; 26 27 int main(){ 28 Father *ptr = new Son(); 29 ptr->fight(); 30 system("pause"); 31 return 0; 32 }
怎么样?很简单吧,是的,模板方法就是这么简单,只用到了类的继承,总之,很简单就是了。
类图
实在不想画这个类图,太简单了,但是为了练手,我们还是画一个看看吧!
总结
模板方法模式是一个很简单的模式,它的核心就是预先在父类封装算法的框架流程,至于每一步的细节要由子类来实现,如果其中每个细节如果算法效率太低,那就可以对单独的细节算法进行优化,这样的好处是“延迟实现”。