Head First 设计模式之第八章——模板方法模式

例子

在一个饮料店中,其提供咖啡与茶两种商品,两个商品的制作过程分别如下:

  1. 茶的制作过程:
    1. 将水烧开;
    2. 用开水冲泡茶叶;
    3. 将饮料倒进杯子;
    4. 添加柠檬;
  2. 咖啡的制作过程:
    1. 将水烧开;
    2. 用开水冲泡咖啡;
    3. 把饮料倒进杯子;
    4. 添加糖与牛奶。

其实茶与咖啡的制作过程是十分相似的,其中第1、3步骤是相同的,而2、4步骤虽不同但十分相似,所以我们可以再作进一步的抽象,将2、4步骤分别抽象为:用开水冲泡、添加调味料。那么咖啡与茶的制作过程就被抽象成相同的了,只是在具体的步骤中进行不同的操作而已。

上述情况可以用下面的类图来实现。其中CaffeineBeverage是一个抽象类,其中prepareRecipe()方法中分别依次实现boilWater()、brew()、pourInCup()、addCondiments()四个方法。其中brew()与addCondiments()是抽象方法,在CaffeineBeverage中是没有实现的。其具体实现由子类Tea、Coffee分别完成。当创建Tea或Coffee对象时,直接调用prepareRecipe()方法即可制作相应的饮料。prepareRecipe()中的流程是一样的,但为什么不同的子类中调用相同的prepareRecipe()却可制作不同的饮料?这是因为不同子类中的具体方法即brew()与addCondiments()具有不同的实现,故可以实现不同的子类制作不同的饮料。

这种设计模式就是模板方法模式。
在这里插入图片描述

概念

上述的实现就是模板方法模式。此处,先说说模板方法模式的定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

这个定义十分简单明了。在进一步讲解模板方法模式之前,先看一下下图的模板方法类图。如图所示,AbstractClass为一个抽象类,其中的templateMethod()方法中定义了一个算法流程,这个流程中包含方法primitiveOperation1()与primitiveOperation2(),而这两个方法是抽象方法,在这个抽象类中还没有实现,这两个方法的具体实现是由这个抽象类的子类完成的,如下图所示,ConcreteClass中实现了这个方法,那么在子类中调用templateMethod()时,算法的具体表现就由子类中的primitiveOperation1()与primitiveOperation2()方法来定义。所以,在不同子类中对这两方法进行不同的实现,那么调用templateMethod()时就会有不同的表现。

所以,这个模式叫模板方法模式也是可以理解的。抽象类中的templateMethod()为一个流程定义了一个模板,而它的子类就按这个模板去填写具体的实现。它的好处是,由抽象类管控整个算法的流程,而具体的实现则由其子类来实现。也可以用领导与下属的视角来理解:领导(AbstractClass)为一个业务指明了方向,下属(ConcreteClass)则这个指导思想的指导下,去实现具体的业务。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值