设计模式--模板方法模式

前面讨论的都是封装,我们封装了对象的创建、方法的调用、复杂接口等,接下来我们要深入封装算法块,让子类可以把自己挂进运算里。

假设我们要跑茶和泡咖啡,他们中有一部分方法是相同的,一部分是有区别的,那么我们可能如下设计:


设计模式--模板方法模式_第1张图片

让我们再进一步分析,上面的brew(冲泡)与steep(浸泡)差异不大,所以给他们换个名字,直接用brew().同理,也可以把addSugarAndMilk()与addLemon()改成addCondiments()好了。

现在prepareRecipe()方法就变成了如下:

void prepareRecipe(){

boilWater();

brew();

pourInCup();

addCondiments();

}

现在超类如下


设计模式--模板方法模式_第2张图片
抽象类


设计模式--模板方法模式_第3张图片
咖啡类


设计模式--模板方法模式_第4张图片
茶类

上面就是模板方法设计模式, prepareRecipe()是我们的模板方法,为什么呢?因为1.它是个方法,2、它用作一个算法的模板,在这个例子中,算法是用来制作咖啡饮料。

模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供实现。

定义模板方法:在一个方法中定义了一个算法的骨架而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。直接点说,模板就是一个方法。更具体地说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,子类负责实现,这样可以确保算法的结构保持不变,同时有子类提供部分实现。


设计模式--模板方法模式_第5张图片


现在还可以给模板方法加个钩子方法,


设计模式--模板方法模式_第6张图片

ps:注意算法内步骤不要切割得太细,但步骤太少,又缺少弹性,所以要看情况定。某些步骤是可选 ,可以将这些步骤定义成钩子,而不是实现成为抽象方法,这样可以让抽象类的子类的负荷减轻。

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

java 模板方法来排序。

java数组类设计者提供我们一个模板方法来排序


设计模式--模板方法模式_第7张图片

比较模板方法与策略模式:

你可能感兴趣的:(设计模式--模板方法模式)