概述
模版的应用,可谓是遍地都是.我们每天上着似曾相识的论坛,天天重复按着模版套写文档.天上飞的,地上跑的,大多是各种模版套出来的.区别只是细微地方不一样,可以说模版就是让我们最大化的重用现有已存在的事物.这也许就是模版模式有人称之为最重要的模式(之一)的原因.设计模式一个承诺不就是实现重用吗.
实例分析
我们直接先来看个实例分析吧,我们现在来写段代码泡茶叶和泡咖啡的,这2样可以说是全世界最风靡的饮料,什么原因呢,因为它们有个共同点,都含有咖啡因,可以让人兴奋,并上瘾.
那么我们来开始写tea和coffee的实现了
Coffee 具体步骤如下 煮开水,煮咖啡,倒咖啡,加牛奶,加糖
Tea 具体步骤如下:煮开水,泡茶,倒茶,加柠檬
很好,但我们发现基本步骤是差不多,甚至部分是完全重复的,那么为了避免冗余代码,方便我们修改,或则有新的饮料出现,我们可以使用模板.首先我们定义什么是模版,模版就是:在一个方法里定义一个算法的框架.部分步骤延迟到子类里实现.模版模式让子类实现模版模版的框架,又可以对局部进行微调.uml图示如下
那么针对泡茶和泡咖啡就可以设计1套共用的模版了:煮开水,泡茶(咖啡),倒到杯子里,加料(柠檬/牛奶,糖),煮开水和倒饮料在父类里直接实现,具体泡 和 加料的方式在子类里实现. uml设计如下:
代码实现
分析完了,实现就是机械行为了:代码如下
1:首先是abstract模版类 :定义好模版
2 :子类咖啡和茶 继承模版父类,重载泡 和 加料的 方法:
3:然后就是测试了,代码如下
测试运行结果:
Boiling water
Steep tea bag into cup
Pouring into cup:
Adding lemon
Boiling water
Dripping Coffee through filter
Pouring into cup:
Adding milk and sugar
思考 :
这个模式不可谓不简单.但应用及其广泛,.net大量的类库也采用了这种模式.,代码重用重要性大家都很清楚,其实这个模式跟策略模式很相像,而且策略模式更灵活,不过模版模式优点在于他给出了一个框架,让子类继承,主的框架还是不变,策略模式则是完全让用户选择所需要用到的策略.
另外对于模板模式需要子类实现的步骤有2种,1种是抽象步骤,必须由子类实现,一种是虚步骤,模板给出一个默认的实现,子类可选择override,也可选择默认的步骤。用哪种用户自己可以考量了。
这里可以看出,虽然整个模板实际运行是由父类和子类的实现的步骤交叉运行,但子类完全不需要了解父类在做什么。上一步怎么做,下一步做什么,子类完全不去管,这也是面向对象的一个重要原则,“don't call us, we'll call u ",底层组件不允许去直接调用高层组件。这也被戏称为好莱坞原则 。
下一篇:《Head First Design Patterns》笔记十:迭代器模式(Iterator Pattern)
上一篇:《Head First Design Patterns》笔记八:外观模式(Facade Pattern)