天天看点

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

<a href="http://www.cnblogs.com/wolf-sun/p/3468100.html">[Head First设计模式]山西面馆中的设计模式——装饰者模式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3473744.html">[Head First设计模式]山西面馆中的设计模式——观察者模式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3475061.html">[Head First设计模式]山西面馆中的设计模式——建造者模式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3485805.html">[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3489549.html">[Head First设计模式]一个人的平安夜——单例模式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3514935.html">[Head First设计模式]抢票中的设计模式——代理模式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3518013.html">[Head First设计模式]面向对象的3特征5原则</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3534573.html">[Head First设计模式]鸭子模型——策略模式</a>

第一天上班,没什么任务,就学习了下模版方法模式,这里也是现学现卖,模版方法给我的感觉是似曾相识,总感觉用过,而当时并不知道是模版方法,挺悲催的。年后第一天,吃饭是个大问题,好不容易找到一个米线馆,人非常的多,只能边等边思考模版方法模式了,跟以前一样,对于吃货来说,只有将知识和吃联系在一起,才能记得更牢。

模版方法模式是最为常见的几个模式之一,模版方法模式需要开发抽象类和具体子类的设计师之间的写作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师负责给出这个算法的各个逻辑步骤。 继承常常作为功能复用的主要工具,这时继承有被滥用的危险。所以,我们有一个设计原则:多用组合,少用继承

是不是继承就根本不应该使用呢?事实上对数据的抽象、继承、封装和多态是面向对象语言的最重要特性。继承不应当被滥用,并不意味着继承根本就不该使用。在GoF书中,绝大多数模式是将依赖于继承的实现转换为基于对象的组合和聚合来实现的。模版方法模式是很少用继承来实现的模式中的一个!而且模版方法模式:鼓励恰当的使用继承。此模式可以用来改写一些拥有相同功能的相关类,将可复用的一般性的行为代码移到基类里面,而把特殊化的行为代码移到子类里面。熟悉模版方法模式便成为一个重新学习继承的好地方。

咖啡因饮料

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

咖啡类

茶类

第一版设计

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

星巴兹咖啡和茶冲泡的分析

星巴兹咖啡和茶冲泡采用了相同的算法:

把水煮沸

用热水泡咖啡或茶

把饮料倒进杯子

在饮料内加入适当的调料

抽象PrepareRecipe()

1、我们遇到的问题是:茶使用SteepTeaBag()和AddLemon()方法,而咖啡使用BrewCoffeeGrinds()和AddSugarAndMilk()方法。

2、无论是咖啡的冲泡,还是茶的浸泡,都是用沸水泡,我们给它一个新的方法名称,比如说Brew()。同样,无论是咖啡加糖和牛奶,还是茶加柠檬,都是加调料,我们也给它一个新的方法名称AddCondiments()。这样,新的prepareRecipe()方法看起来就象这样:

3、CaffeineBeverage(咖啡因饮料)超类:

4、咖啡和茶都依赖于超类(咖啡因饮料)处理冲泡法。

我们做了什么?

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

 刚刚实现的就是模板方法模式。模板方法定义了一个算法步骤,并允许子类为一个或多个步骤提供实现。我们再看看咖啡因饮料类的结构(下页)。

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

模板方法如何工作(以泡茶为例)

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

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

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

钩子是一种声明为抽象类的方法,但只有空的或默认的实现。有了钩子,可以让子类有能力对算法的不同点进行挂钩。要不要挂钩,由子类自行决定。

 对模版方法挂钩

使用钩子

为了使用钩子,我们在子类中覆盖它。在这里,钩子控制咖啡因饮料是否执行某部分算法。或更确切的说是在饮料中要不要加进调料。

测试

结果

[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式

好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。

好莱坞原则可以防止“依赖腐败”。当高层组件依赖底层组件,底层组件又依赖高层组件,高层组件又依赖边侧组件,边侧组件又依赖高层组件......,依赖腐败就发生了。在这种情况下,没有人可以轻易搞懂系统是如何设计的。

在好莱坞原则下,允许底层组件挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些底层组件。即高层组件对底层组件的方式是:“别调用我们,我们会调用你”。

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

好莱坞原则与模版方法

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

云南米线分为:秀才米线,举人米线,状元米线等。但是他们的制作过程基本相同,只是配料不同罢了,同样可以将制作过程放在模版方法中。

[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式

View Code

[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式
[Head First设计模式]云南米线馆中的设计模式——模版方法模式

 模版方法理解起来还是比较轻松的,在项目中真的用到过,只是当时不知道它还有个漂亮的名字。

参考书:

Head First 设计模式

继续阅读